扩展字典,其中Key的类型为String

Arb*_*tur 12 dictionary protocols extend swift swift2

我想扩展一个Dictionary的方法,但只有当Key是String类型时.

我试着这样做:

extension Dictionary where Key: String {
    mutating func lowercaseKeys() {
        for key in self.keys {
            self[key.lowercase] = self.removeValueForKey(key)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并得到错误:

键入'Key'约束为非协议类型'String'

基于此错误消息,我可以告诉我只能通过协议进行这种过滤...有没有办法绕过这个?

Pat*_*nch 18

我相信最符合您需求的协议是StringLiteralConvertible,只需几行,就可以让您实现这一目标

extension Dictionary where Key: StringLiteralConvertible {
    mutating func setAllKeysLowercase() {
        for key in self.keys {
            if let lowercaseKey = String(key).lowercaseString as? Key {
                self[lowercaseKey] = self.removeValueForKey(key)
            }
        }
    }
}

var stringKeyDictionary = [ "Hello" : NSObject(), "World" : NSObject() ]
stringKeyDictionary.setAllKeysLowercase()
print( stringKeyDictionary )

// Prints: ["hello": <NSObject: 0x1007033c0>, "world": <NSObject: 0x1007033d0>]

var numberKeyDictionary = [ 0 : NSObject(), 1: NSObject() ]
numberKeyDictionary.setAllKeysLowercase() //< Won't compile, keys are not strings
Run Code Online (Sandbox Code Playgroud)

  • 从Swift 3开始,不推荐使用StringLiteralConvertible.请改用ExpressibleByStringLiteral. (5认同)