public class FakeFeatureManagerForTesting: FeatureManager {
public var userEnabledFeature = false //is this legal? Why is compiler not complaining?
}
В протоколе говорится, что соответствующие ему члены должны иметь свойство Bool
userEnabledFeature
, которое может быть прочитано, а не свойство только для чтения.Однако, если у вас есть переменная с типом протокола, это не позволит вам присвоить свойство, даже если значение переменной является реализацией, если оно доступно для записи.
Протокол не определяет, как онреализовано (если его вычисляемое свойство, хранимое свойство и т. д.), но какова его подпись, и если она должна быть доступной только для чтения или также должна иметь доступ для записи тоже.Если вы отметите его как доступный только для чтения, реализация все равно может сделать запись доступной для записи, так как в этом случае протокол на самом деле не заботится о доступе к записи.
Вы можете получить вычисляемое свойство следующим образом:
public class FakeFeatureManagerForTesting: FeatureManager {
public var userEnabledFeature: Bool {
// do some work here and return value or fallback to false
return false
}
}
С другой стороны, вы также можете иметь только частное настраиваемое свойство, которое можно изменить только из файла или класса / структуры:
public class FakeFeatureManagerForTesting: FeatureManager {
public private(set) var userEnabledFeature = false
public func updateUserEnabledFeature(enabled: Bool) {
userEnabledFeature = enabled // will work just fine
}
}
let manager = FakeFeatureManagerForTesting()
manager.updateUserEnabledFeature(enabled: true) // will work
manager.userEnabledFeature = true // won't compile, because modifying is allowed privately only