2016-06-10 161 views
0

我有一些对象,每个对象都需要被锁定,直到购买。Swift协议共享功能

每个对象(NSManaged)都有一个productName StringisPurchased Bool

我写了一个函数isLocked()它使用那里属性以及单身的外部检查。

这怎么可以组合成一个协议,以便该协议包含isLocked函数的实现和对象可以坚持协议,然后在需要时调用isLocked?

+0

如果你需要一个通用的实现,这听起来像你正在寻找一个超类而不是协议。 –

+0

是的,很明显,但这需要大量的重构,而这在目前是不可能的。我确信我使用协议看到了类似的东西。 – jarryd

+0

在Raywenderlich网站https://www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2或wwdc2015 https://developer.apple.com/videos/上面的面向协议的编程检查播放/ wwdc2015/408 /。希望它有帮助。 –

回答

2

如果我没有弄错,这可以通过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() { 

} 
} 
+0

欲了解更多信息,你可以检查苹果文档https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html协议扩展部分。也可能NSHipster的手册将更适合你http://nshipster.com/swift-default-protocol-implementations/。 – iyuna

+0

productName和isPurchased是每个核心数据实体的属性,我不能在协议中声明它们。 – jarryd

+0

使用一个计算的属性来封装这个属性。 – kandelvijaya