数组从字典键快速

尝试用swift中的字典中的键填充数组。

var componentArray: [String] let dict = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("Components", ofType: "plist")!) componentArray = dict.allKeys 

这将返回一个错误:“AnyObject”与string不相同

也试过

 componentArray = dict.allKeys as String 

但得到:'string'不能转换为[string]

Swift 3

 componentArray = Array(dict.keys) // for Dictionary componentArray = dict.allKeys // for NSDictionary 

用Swift 3, Dictionary有一个keys属性。 keys有以下声明:

 var keys: LazyMapCollection<Dictionary<Key, Value>, Key> { get } 

包含字典的键的集合。

请注意, LazyMapCollection可以很容易地映射到Arrayinit(_:)初始值设定项。


NSDictionary[String]

以下iOS AppDelegate类片段展示了如何使用NSDictionary keys属性获取string数组( [String] ):

在这里输入图像说明

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { let string = Bundle.main.path(forResource: "Components", ofType: "plist")! if let dict = NSDictionary(contentsOfFile: string) as? [String : Int] { let lazyMapCollection = dict.keys let componentArray = Array(lazyMapCollection) print(componentArray) // prints: ["Car", "Boat"] } return true } 

[String: Int][String]

更一般的方式,下面的Playground代码展示了如何使用string键和整数值( [String: Int] )的字典中的keys属性来获取string数组( [String: Int] ):

 let dictionary = ["Gabrielle": 49, "Bree": 32, "Susan": 12, "Lynette": 7] let lazyMapCollection = dictionary.keys let stringArray = Array(lazyMapCollection) print(stringArray) // prints: ["Bree", "Susan", "Lynette", "Gabrielle"] 

[Int: String][String]

以下Playground代码显示如何使用整数键和string值( [Int: String] )的字典中的keys属性来获取string数组( [Int: String] ):

 let dictionary = [49: "Gabrielle", 32: "Bree", 12: "Susan", 7: "Lynette"] let lazyMapCollection = dictionary.keys let stringArray = Array(lazyMapCollection.map { String($0) }) // let stringArray = Array(lazyMapCollection).map { String($0) } // also works print(stringArray) // prints: ["32", "12", "7", "49"] 

从Swift中的字典键数组

 componentArray = [String] (dict.keys) 

dict.allKeys不是一个string。 这是一个[String] ,就像错误信息告诉你的那样(当然,假设键所有的string;当你这样说的时候,这正是你所断言的)。

所以,无论是从inputcomponentArray开始,都是作为[AnyObject] ,因为这是Cocoa API中input的内容,否则,如果你使用dict.allKeys ,将它dict.allKeys[String] ,因为这是你inputcomponentArray

 extension Array { public func toDictionary<Key: Hashable>(with selectKey: (Element) -> Key) -> [Key:Element] { var dict = [Key:Element]() for element in self { dict[selectKey(element)] = element } return dict } }