我有一些对象,每个对象都需要被锁定,直到购买。Swift协议共享功能
每个对象(NSManaged)都有一个productName String
和isPurchased Bool
。
我写了一个函数isLocked()
它使用那里属性以及单身的外部检查。
这怎么可以组合成一个协议,以便该协议包含isLocked函数的实现和对象可以坚持协议,然后在需要时调用isLocked?
我有一些对象,每个对象都需要被锁定,直到购买。Swift协议共享功能
每个对象(NSManaged)都有一个productName String
和isPurchased Bool
。
我写了一个函数isLocked()
它使用那里属性以及单身的外部检查。
这怎么可以组合成一个协议,以便该协议包含isLocked函数的实现和对象可以坚持协议,然后在需要时调用isLocked?
如果我没有弄错,这可以通过Swift中的Default实现来实现。
protocol Locakable {
var productName: String { get }
var isPurchased: Bool { get }
func lock()
func unlock()
}
extension Locakable {
func isLocked() {
if isPurchased {
//do something
//lock it
unlock()
} else {
lock()
}
}
}
关于那什么混入或默认实现赤明此Wiki网页https://en.wikipedia.org/wiki/Mixin
然而更多信息,请注意isLocked()
静态调度。评论是否有不清楚的地方。
如果可能的话,您还可以抽象锁定和解锁的想法,并在协议扩展上编写默认实现。或者像这样提供一个定制点。
class Item: Locakable {
var productName = "ItemName"
var isPurchased = false
init() {
isLocked()
}
func lock() {
}
func unlock() {
}
}
欲了解更多信息,你可以检查苹果文档https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html协议扩展部分。也可能NSHipster的手册将更适合你http://nshipster.com/swift-default-protocol-implementations/。 – iyuna
productName和isPurchased是每个核心数据实体的属性,我不能在协议中声明它们。 – jarryd
使用一个计算的属性来封装这个属性。 – kandelvijaya
如果你需要一个通用的实现,这听起来像你正在寻找一个超类而不是协议。 –
是的,很明显,但这需要大量的重构,而这在目前是不可能的。我确信我使用协议看到了类似的东西。 – jarryd
在Raywenderlich网站https://www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2或wwdc2015 https://developer.apple.com/videos/上面的面向协议的编程检查播放/ wwdc2015/408 /。希望它有帮助。 –