![](/img/trans.png)
[英]Swift: How to pass the Generic protocol as a parameter for another protocol
[英]How to pass generic protocol as function parameter
我必須將協議作為參數傳遞給 function。 協議是通用的,具有關聯的類型。 我找不到這樣做的好方法。
我想要實現的基本上是在 json 中存儲一個鍵值對。 所以我有一個通用數據類型協議,它設置/獲取值(根據數據類型設置和獲取)
在另一個協議中,我想將此通用數據類型協議作為 function 參數傳遞。
protocol Datatype {
associatedtype dataType
func get(json: JSON) -> dataType?
func set(json:inout JSON, key: String, value: dataType)
}
class DatatypeString: Datatype{
typealias dataType = String
func get(json: JSON) -> dataType? {
return json.stringValue
}
func set(json: inout JSON, key: String, value: dataType) {
json[key] = JSON(value)
}
}
class DatatypeInt: Datatype{
typealias dataType = Int
func get(json: JSON) -> Int? {
return json.intValue
}
func set(json: inout JSON, key: String, value: Int) {
json[key] = JSON(value)
}
}
在下面的代碼中,我得到Protocol 'Datatype' 只能用作通用約束,因為它具有 Self 或關聯的類型要求
protocol Final {
func set<T>(key: String, type: Datatype ,value: T) //getting error
}
class A : Final {
var root:JSON = [:]
func set<T>(key: String, type: Datatype, value: T) {
type.set(json: &root, key: key, value: value)
}
class test {
let a = A()
let dataType = DatatypeString()
a.set("key",datatype, "VALUE")
}
您必須使用Datatype
作為通用約束:
func set<T: Datatype>(key: String, type: T ,value: T.dataType)
請注意,您還需要如何將value
參數的類型更改為T.dataType
,這樣才能保證類型安全。 也就是你傳入的值必須和type
參數的dataType
類型相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.