今天學員群裡有人提了這麼一個問題,為什麼把特性的字典類型作為泛型類型約束的時候,就必然報錯?
1 |
inheritance from non-protocol, non-class type 'Dictionary<String, Any>' |
顯然,說的很明確了,“你不能從一個非協議、非類的類型繼承”。顯然,字典是個泛型結構體……
那麼解決思路也很明確了,創建一個類來裝飾個字典或許是個不錯的選擇但太麻煩,那麼就從協議上下手。
有條件的協議遵循
我們可以給字典這個結構體進行擴展,讓它遵循一個我們的空協議:
1 |
protocol targetDictionaryType {} |
但注意這裡我們限定條件,即字典的 Key 必須是 String 類型:
1 |
extension Dictionary :targetDictionaryType where Key == String {} |
內容全部為空,因為不用做任何額外的操作。
這樣,我們就可以用這個協議來進行約束了,如果字典的類型不符合要求,那麼這個字典就不會遵循我們的協議:
1 2 3 |
func test<T:targetDictionaryType>(dict:T) { ... } |
測試結果
1 2 3 4 |
let d = ["":1] test(dict: d) //正常工作 |
1 2 3 4 5 |
let a = [1:1] test(dict: a) //error: cannot invoke 'test(dict:)' with an argument list of type '(dict: [Int : Int])' |
本文由 落格博客 原創撰寫:落格博客 » Swift 中如何使用字典類型作為泛型約束
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3101.html
範型=?泛型
靠這個居然沒統一,是泛型!
改好了~