数组从字典键快速
尝试用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
可以很容易地映射到Array
的init(_:)
初始值设定项。
从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 } }