Быстрая структура, эквивалентная изменяемому ключевому слову 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)")