我有一个带有可选属性的协议。
大多数符合此协议的类型将具有相应的可选属性。但是,其中一个具有相同类型和名称的非可选属性。
protocol SomeProtocol {
var foo: Int? { get }
}
struct StructA: SomeProtocol {
let foo: Int?
}
struct StructB: SomeProtocol {
let foo: Int // Type 'StructB' does not conform to protocol 'SomeProtocol'
}
按下Xcode的“Fix-是否要添加协议存根?”按钮,会添加属性的可选版本,但现在结构体中存在无效的重复变量名称:
struct StructB: SomeProtocol {
let foo: Int
var foo: Int? { return foo } // Invalid redeclaration of 'foo'
}
在仅使用
{ get }
的情况下,我曾经认为这会“自动运行”,因为非可选项总是满足可选项的约束条件,类似于在带有可选项返回类型的函数中返回非可选项。但显然并非如此。对于函数也是一样的;协议的
func bar() -> Int?
无法满足声明 func bar() -> Int
的符合类型。是否有任何方法可以解决这个问题?我不想重新命名变量或添加中间 getter。
Swift 是否考虑过这种情况?为什么不允许非可选类型满足可选协议变量?