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

var componentArray: [String]

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

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

也试过

componentArray = dict.allKeys as String 

but get: 'String'不能转换为[String]


当前回答

字典allKeys不是一个字符串。它是一个[String],就像错误消息告诉你的那样(当然,假设键都是字符串;这正是你所说的)。

所以,要么首先将componentArray键入为[AnyObject],因为这是它在Cocoa API中键入的方式,要么,如果你强制转换dict。allKeys,将它转换为[String],因为这是你键入componentArray的方式。

其他回答

dict.keys.sorted() 

给出[String] https://developer.apple.com/documentation/swift/array/2945003-sorted

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

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

仅包含字典键的集合。

注意,LazyMapCollection可以很容易地用Array的init(_:)初始化器映射到Array。


从NSDictionary到[String]

下面的iOS AppDelegate类片段展示了如何从NSDictionary中使用keys属性获得一个字符串数组([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代码以更通用的方式展示了如何使用keys属性从具有字符串键和整型值([String: Int])的字典中获得一个字符串数组([String]):

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代码展示了如何从具有整型键和字符串值([Int: String])的字典中使用keys属性获得一个字符串数组([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字典w/ String键。就像下面这个。

let dict: [String: Int] = ["hey": 1, "yo": 2, "sup": 3, "hello": 4, "whassup": 5]

这是我将使用的扩展。

extension Dictionary {
  func allKeys() -> [String] {
    guard self.keys.first is String else {
      debugPrint("This function will not return other hashable types. (Only strings)")
      return []
    }
    return self.flatMap { (anEntry) -> String? in
                          guard let temp = anEntry.key as? String else { return nil }
                          return temp }
  }
}

我稍后会用这个得到所有的键。

let componentsArray = dict.allKeys()

斯威夫特和斯威夫特

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

componentArray = dict.allKeys // for NSDictionary

数组从字典键在Swift

componentArray = [String] (dict.keys)