簡體   English   中英

如何定義符合協議的對象數組?

[英]How to define an array of objects conforming to a protocol?

鑒於:

protocol MyProtocol {
    typealias T
    var abc: T { get }
}

還有一個實現MyProtocol的類:

class XYZ: MyProtocol {
    typealias T = SomeObject
    var abc: T { /* Implementation */ }
}

如何定義符合MyProtocol的對象數組?

var list = [MyProtocol]()

給出(以及大量的SourceKit崩潰)以下錯誤:

Protocol 'MyProtocol' can only be used as a generic constraint because it has Self or associated type requirements

即使在MyProtocol中實際定義了MyProtocol

有沒有辦法讓符合協議的對象列表具有通用約束?

問題是關於使用泛型對應的協議,鍵入別名。 這聽起來很奇怪,但是如果你定義了一個類型別名,你就不能將協議用作一個類型,這意味着你不能聲明那個協議類型的變量,一個函數參數等。你不能將它用作一個通用對象。陣列。

正如錯誤所說,您可以使用它的唯一用法是作為通用約束(如class Test<T:ProtocolWithAlias> )。

要證明這一點,只需從協議中刪除typealias(注意,這只是為了證明,它不是解決方案):

protocol MyProtocol {
    var abc: Int { get }
}

並相應地修改其余的示例代碼:

class XYZ: MyProtocol {
    var abc: Int { return  32 }
}

var list = [MyProtocol]()

你會發現它有效。

您可能對如何解決此問題更感興趣。 我想不出任何優雅的解決方案,只需以下2:

  • 從協議中刪除typealias並用AnyObject替換T (丑陋的解決方案!!)
  • 把協議變成一個類(但這不是一個適用於所有情況的解決方案)

但你可能會說,我不喜歡他們中的任何一個。 我能提供的唯一建議是重新考慮你的設計,並弄清楚你是否可以使用不同的方式(即不使用typealased協議)來實現相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM