2015-11-21 44 views
1

我想在Swift的內置字典中添加一個擴展,使用關於鍵和值類型的約束。使用約束擴展字典

事實上,我會使用NSCalendarUnit作爲字典的鍵和AnyObject作爲值;爲了做到這一點,我伸出NSCalendarUnit是符合哈希的協議:

extension NSCalendarUnit: Hashable { 
    public var hashValue: Int { 
     get { 
      return Int(self.rawValue) 
     } 
    } 
} 

然後我創建了我的字典的擴展:

extension Dictionary where Value: AnyObject, Key: NSCalendarUnit { 
    public func myFunc() -> ... { 
     // ... code 
    } 
} 

雖然構建succeded我可以在裏面看到一個錯誤控制檯:

Type 'Key' constrained to non-protocol type 'NSCalendarUnit' 

有什麼想法嗎?

回答

2
import XCPlayground 
import Foundation 

protocol CalendarAsDictKey: Hashable {} 

extension NSCalendarUnit: CalendarAsDictKey { 
    public var hashValue: Int { 
     get { 
      return Int(self.rawValue) 
     } 
    } 
} 

extension Dictionary where Value: AnyObject, Key: CalendarAsDictKey { 
    func myFunc() ->Void { 
     self.forEach {key,value in 
      print(key, value) 
     } 
    } 
} 

let day = NSCalendarUnit.Day 
let era = NSCalendarUnit.Era 

let dict = [day: "day", era: NSString(string: "era")] 
dict.myFunc() 
/* 
NSCalendarUnit(rawValue: 16) day 
NSCalendarUnit(rawValue: 2) era 
*/ 
+0

太棒了!非常感謝你 – danielemm

+0

@danielemm歡迎你。看到NSString那裏!字符串不能轉換爲AnyObject ...最好避免使用「僞通用」方法,並儘可能使用正確類型,或使用真正的通用方法。 – user3441734

+0

不幸的是我不能使用String,因爲NSCalendarUnit可以包含NSCalendar和NSTimeZone對象以及其他值(由Int表示)。 – danielemm