[英]how to extend a swift protocol with an extension so that classes get an implemented variable defined by the protocol
以下class:
class User {
var name = "Max"
var surname = "Mustermann"
}
和以下协议:
protocol Sharable {
func share(name: String)
var isSharable: Bool { get set }
}
以某种方式扩展协议sharable
,以便User
的子类获得share(:)
和isSharable
的实现版本。
以下扩展尝试执行此操作:
extension Sharable where Self: User {
func share(name: String) { print(name) }
var isSharable: Bool { return !name.isEmpty }
}
创建的子类Admin
应该免费获得Sharable
的所有功能,而无需存储和实现变量和函数。
class Admin: User, Sharable {
}
但是 Xcode 会打印错误:
“管理员”不符合“可共享”协议
Xcode 提出以下建议:
class Admin: User, Sharable {
var isSharable: Bool
}
现在 Xcode 打印错误:
class 'Admin' 没有初始化器
有没有办法扩展协议Sharable
以便Admin
有一个变量isSharable
而不定义或初始化它? 基本上就像它与 function share(:)
一样,它不必由子类实现,因为它是由扩展实现的。
class ArbitraryObject: User, Sharable {
// no implementation or initializing of isSharable or share(:)
}
let arbitraryObject = ArbitraryObject()
if arbitraryObject.isSharable {
arbitraryObject.share(name: arbitraryObject.name)
}
目前您的协议将isSharable
定义为{ get set }
protocol Sharable {
func share(name: String)
var isSharable: Bool { get set }
}
这意味着当您构建扩展时,它实际上并不符合协议
extension Sharable where Self: User {
func share(name: String) { print(name) }
var isSharable: Bool { return !name.isEmpty }
}
这是因为您已在扩展中将isSharable
定义为计算属性。 计算属性只能get
。
您可以通过删除set
要求使您的扩展符合Sharable
协议。 所以你的协议会变成:
protocol Sharable {
func share(name: String)
var isSharable: Bool { get }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.