簡體   English   中英

如何將通用協議作為 function 參數傳遞

[英]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.

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