Быстрая структура, эквивалентная изменяемому ключевому слову C++?

Есть ли эквивалент в Swift для C++ mutable ключевое слово? У меня есть структура, реализующая протокол, включающий немутирующую функцию, однако внутренняя реализация изменяет внутреннее состояние. Есть ли способ сделать член var класса изменяемым с помощью этой функции, не изменяя определение протокола, делая функцию mutating?

например

public protocol P {
    // f is semantically unmutating
    func f
}

public struct S : P {
    // f is semantically unmutating, but does change some internal state
    public func f {
        v += 1
    }
    private var v: Int // How to mark this as mutable for internal purposes?
    ...
}

2 ответа

То же, что и в с++

      public struct S : P {
    // f is semantically unmutating, but does change some internal state
    public func f {
       increment()
    }
    private mutating func increment() {
       v += 1
    }
    private var v: Int // How to mark this as mutable for internal purposes?
    ...
}

Я не думаю, что есть способ сделать то, что вы пытаетесь сделать, кроме как изменить семантику протокола на mutating F ()

Ваш единственный вариант - создать новую изменяющуюся версию протокола P MutatingP а затем расширить структуру MutatingP, Это может иметь mutating func f() функция, которую вы можете реализовать в структуре

Это по сути то же самое, что и другой ответ.

Вот еще одно очень кривое решение. Но это отчасти удовлетворяет вашим требованиям. Вам нужно будет работать с двумя глобальными переменными. Int переменная V а также struct S переменная aStruct, Код в значительной степени говорит сам за себя. Самая большая проблема в этом подходе состоит в том, что вы не можете иметь два экземпляра структуры одновременно. Но это можно сделать с помощью массива struct вместо единственной struct.

Суть в том, что он сохраняет неизменную семантику протокола, но все же позволяет вам изменять переменную. Более простой способ может быть разработан с использованием того же подхода.

import UIKit

protocol P {
    func f()
}

var aStruct:S!
var V = 100 {
    didSet {
        print("changed V to \(V)")
        if var s = aStruct {
            s.v = 200
        }
    }
}

struct S : P  {
    var v:Int = 100 {
        didSet {
            aStruct = self
        }
    }
    init() {
        aStruct = self
    }
    func f() {
        V = 200
    }
}

let s = S()
s.f()
print("s.v = \(s.v)...aStruct.v = \(aStruct.v)")
Другие вопросы по тегам