繁体   English   中英

如何使用扩展扩展 swift 协议,以便类获得协议定义的实现变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM