假設我有一個類實現了一個漂亮的主題觀察者模式。 (這是夫特3;夫特2將在本質上沒有什麼不同。)在Swift中編寫一個共同的主題觀察者實現
protocol Delegate : class
{
func method()
}
class Subject
{
private typealias WeakDelegate = WeakReference<Delegate>
private var nextAvailableDelegateId = 0
private var delegates = [ Int : WeakDelegate ]()
@discardableResult
public func addDelegate(_ delegate: Delegate) -> Int
{
let id = nextAvailableDelegateId
nextAvailableDelegateId += 1
delegates[ id ] = WeakDelegate(value: delegate)
return id
}
public func removeDelegate(_ idForDelegate: Int)
{
delegates.removeValue(forKey: idForDelegate)
}
fileprivate func eachDelegate(fn: (Delegate) -> Void)
{
for (key, weakDelegate) in delegates
{
// Has this weak delegate reference become nil?
//
guard let delegate = weakDelegate.value else
{
// Yes. Remove it.
delegates.removeValue(forKey: key)
continue
}
fn(delegate)
}
}
private func exampleNotifier()
{
eachDelegate{ $0.method() }
}
}
(我走了慣用夫特術語「委託」爲大致等同於所述設計圖案概念「觀察者」。)
以上WeakReference
類型不是嚴格意義上講這個問題的一部分,但如果你很好奇:
public class WeakReference<T>
{
public var value: T?
{
return abstractValue as? T
}
public init(value: T)
{
abstractValue = value as AnyObject
}
private weak var abstractValue: AnyObject?
}
現在我想創建另一個類類似於Subject
與其他代表協議類似於Delegate
。我如何在新類中使用我已經爲Subject
編寫的實現?
一個答案是複製和粘貼代碼。不是一個好的答案。
在C++中,我們可以創建一個真正的mixin,一個包含實現Subject的所有代碼和數據的類,以泛型Delegate類型爲模板,並且在我們希望使其他類作爲學科。相當微不足道。
協議,協議擴展和泛型似乎有一些這種代碼重用所必需的機制,但我不知道如何實現它。
幫助?
也許我誤解了,但是你不能從'Subject'繼承你的新類嗎? – sdasdadas
@sdasdadas想象一下,我需要一對新的類,'NewSubject'和'NewDelegate'。問題是:如何繼承'Subject',使NewDelegate成爲新的委託類型,例如'eachDelegate()'接受一個帶有'NewDelegate'的函數? – OldPeculier