我有 2 個這樣的協議:
protocol Receiver {
associatedtype Input
func send(_ input: Input)
}
protocol Sender {
associatedtype Output
init<T: Receiver>(_ receiver: T) where T.Input == Output
}
為了實作Sender,我首先這樣做:
class TestSender: Sender {
typealias Output = String
required init<T: Receiver>(_ receiver: T) where T.Input == Output {
}
}
但是我需要將receiverfrominit作為類屬性進行存盤。由于Receiver有關聯的型別要求,我必須向整個TestSender類添加一個泛型型別約束,如下所示:
class TestSender<T: Receiver>: Sender where T.Input == String
然后我可以TestSender像這樣宣告一個屬性:
private let receiver: T
但是在初始值設定項中,我無法分配receiver.
required init<T: Receiver>(_ receiver: T) where T.Input == Output {
self.receiver = receiver // Cannot assign value of type 'T' to type 'T'
}
我嘗試按如下方式更改 init 方法:
init(_ receiver: T) {
self.receiver = receiver
}
但是現在,Swift 編譯器說我沒有正確遵守協議。做這樣的事情的正確方法是什么?
uj5u.com熱心網友回復:
解決方案
您可以在協議上設定Receiver一個,以便 a在其.associatedtypeSenderSenderReceiver
代碼:
protocol Sender {
associatedtype InputReceiver: Receiver
associatedtype Output = InputReceiver.Input
init(_ receiver: InputReceiver)
}
class TestSender<T: Receiver>: Sender {
typealias Output = String
private let receiver: T
required init(_ receiver: T) {
self.receiver = receiver
}
}
為什么原始代碼不起作用?
使用最新的代碼,您應該會看到以下錯誤:
型別“TestSender”不符合協議“Sender”
這表明某些要求沒有得到滿足。如果單擊 fix-it,則表明初始化程式存在問題。如果再次單擊修復它,您將回到以下問題:
無法將“T”型別的值分配給“T”型別
這是因為您在初始化器T上有一個泛型TestSender 和一個泛型T。這些是不同的型別。
但是,忽略這一點,問題的根源在于:在您的Sender協議中,您在初始化程式上只有一個泛型,而在您的TestSender類中,您正試圖在類本身上創建一個泛型。
要使協議“通用”,您可以給它一個associatedtype. 由于Receiver是使泛型化的東西,因此用于創建associatedtype.
因為我們有Receiver泛型,我們也可以獲取Output型別Sender。
我希望這是有道理的,請問您是否有任何問題(這很難解釋!)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/394603.html
上一篇:是否可以使具有兩個型別引數的泛型方法僅推斷其中一個?
下一篇:打字稿:通用未推斷
