2015-11-21 21 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