Mảng từ khóa từ điển trong swift


256

Cố gắng điền vào một mảng với các chuỗi từ các phím trong từ điển nhanh chóng.

var componentArray: [String]

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

Điều này trả về lỗi: 'AnyObject' không giống với chuỗi

Cũng đã thử

componentArray = dict.allKeys as String 

nhưng nhận được: 'Chuỗi' không thể chuyển đổi thành [Chuỗi]

Câu trả lời:


534

Swift 3 & Swift 4

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

componentArray = dict.allKeys // for NSDictionary

Thật thú vị, trong một vòng lặp for - cho tên trong dict.allKeys - 'name' trở thành một chuỗi và có thể được in và xử lý khác.
green_knight 16/2/2016

Dict không có phương thức khóa. Đây là một ví dụ của NSDipedia, không phải là Từ điển.
Womble

2
dict.map {$ 0.key}
Nilanshu Jaiswal

55

Với Swift 3, Dictionarycó một keystài sản. keyscó tuyên bố sau:

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

Một bộ sưu tập chỉ chứa các phím của từ điển.

Lưu ý rằng LazyMapCollectioncó thể dễ dàng được ánh xạ tới một Arrayvới Array's init(_:)initializer.


Từ NSDictionary đến[String]

AppDelegateĐoạn mã lớp iOS sau đây cho biết cách lấy một chuỗi các chuỗi ( [String]) bằng cách sử dụng thuộc keystính từ một NSDictionary:

nhập mô tả hình ảnh ở đây

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
}

Từ[String: Int] đến[String]

Nói một cách tổng quát hơn, mã Playground sau đây cho biết cách lấy một chuỗi các chuỗi ( [String]) bằng cách sử dụng thuộc keystính từ một từ điển với các khóa chuỗi và các giá trị nguyên ( [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"]

Từ[Int: String] đến[String]

Mã Playground sau đây cho biết cách lấy một chuỗi các chuỗi ( [String]) bằng cách sử dụng thuộc keystính từ từ điển với các khóa nguyên và giá trị chuỗi ( [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"]

cảm ơn vì chi tiết Trong Swift 4.x loại là Dictionary<String, String>.Keys- bạn có hiểu biết gì khi chúng tôi muốn sử dụng loại đó không và bằng cách nào?
bshirley

46

Mảng từ khóa từ điển trong Swift

componentArray = [String] (dict.keys)

Tôi không biết, tại sao mọi người không thích cú pháp tốc ký trong khi nó rõ ràng hơn nhiều để hiểu.
Natasha

9

dict.allKeyskhông phải là một chuỗi. Đó là một [String], chính xác như thông báo lỗi cho bạn biết (tất nhiên, giả sử rằng các khóa tất cả các chuỗi; đây chính xác là những gì bạn đang khẳng định khi bạn nói điều đó).

Vì vậy, hãy bắt đầu bằng cách nhập componentArraydưới dạng [AnyObject], vì đó là cách nó được nhập vào API API, hoặc nếu không, nếu bạn sử dụng dict.allKeys, hãy chuyển nó thành [String], bởi vì đó là cách bạn đã nhập componentArray.


1
Điều này dường như không còn đúng nữa. Trong Swift 4.2 dict.keys (thay thế .allKeys) không phải là [Chuỗi], đó là [Từ điển <Chuỗi, Bất kỳ> .Keys] và phải được truyền trước khi gán cho một biến loại [Chuỗi] @santo dường như có ví dụ làm việc đơn giản nhất về cách làm điều đó.
timeSmith

5
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
    }
}

3

NSDadataClass (truyền theo tham chiếu) Từ điểnCấu trúc (truyền theo giá trị ) ====== Mảng từ NSDipedia ======NSDadata là loại lớp Từ điển là cấu trúc của khóa và giá trị

NSDipediaallKeysallValues có các thuộc tính với loại [Any] .NSDipedia có các thuộc tính [Bất kỳ] cho allkey và allvalues

  let objesctNSDictionary = 
    NSDictionary.init(dictionary: ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"])
            let objectArrayOfAllKeys:Array = objesctNSDictionary.allKeys
            let objectArrayOfAllValues:Array = objesctNSDictionary.allValues
            print(objectArrayOfAllKeys)
            print(objectArrayOfAllValues)

====== Mảng từ điển ======

Tài liệu tham khảo của Apple cho các thuộc tính khóagiá trị của Dictionary . nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

let objectDictionary:Dictionary = 
            ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"]
    let objectArrayOfAllKeys:Array = Array(objectDictionary.keys)          
    let objectArrayOfAllValues:Array = Array(objectDictionary.values)
    print(objectArrayOfAllKeys)
    print(objectArrayOfAllValues)


3

Từ tài liệu chính thức của Apple Array :

init(_:) - Tạo một mảng chứa các phần tử của chuỗi.

Tờ khai

Array.init<S>(_ s: S) where Element == S.Element, S : Sequence

Thông số

s - Chuỗi các phần tử để biến thành một mảng.

Thảo luận

Bạn có thể sử dụng trình khởi tạo này để tạo một mảng từ bất kỳ loại nào khác phù hợp với giao thức Sequence ... Bạn cũng có thể sử dụng trình khởi tạo này để chuyển đổi một chuỗi phức tạp hoặc loại bộ sưu tập trở lại một mảng. Ví dụ: thuộc tính khóa của từ điển không phải là một mảng có bộ lưu trữ riêng, đó là bộ sưu tập ánh xạ các thành phần của nó từ từ điển khi chúng được truy cập, tiết kiệm thời gian và không gian cần thiết để phân bổ một mảng. Tuy nhiên, nếu bạn cần truyền các khóa đó cho một phương thức lấy một mảng, hãy sử dụng trình khởi tạo này để chuyển đổi danh sách đó từ loại của nó LazyMapCollection<Dictionary<String, Int>, Int> to a simple [String].

func cacheImagesWithNames(names: [String]) {
    // custom image loading and caching
 }

let namedHues: [String: Int] = ["Vermillion": 18, "Magenta": 302,
        "Gold": 50, "Cerise": 320]
let colorNames = Array(namedHues.keys)
cacheImagesWithNames(colorNames)

print(colorNames)
// Prints "["Gold", "Cerise", "Magenta", "Vermillion"]"

1

Câu trả lời này sẽ dành cho từ điển nhanh chóng với các phím w / String. Như cái này dưới đây .

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

Đây là phần mở rộng tôi sẽ sử dụng.

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 }
  }
}

Và tôi sẽ nhận được tất cả các khóa sau này bằng cách sử dụng này.

let componentsArray = dict.allKeys()

1

Swift 5

var dict = ["key1":"Value1", "key2":"Value2"]

let k = dict.keys

var a: [String]()
a.append(contentsOf: k)

Điều này làm việc cho tôi.


1

Bạn có thể sử dụng dictionary.map như thế này:

let myKeys: [String] = myDictionary.map{String($0.key) }

Giải thích: Bản đồ lặp qua myDipedia và chấp nhận mỗi cặp khóa và giá trị là $ 0. Từ đây bạn có thể nhận được $ 0.key hoặc $ 0.value. Bên trong bao đóng dấu {}, bạn có thể chuyển đổi từng phần tử và trả về phần tử đó. Vì bạn muốn $ 0 và bạn muốn nó dưới dạng chuỗi, sau đó bạn chuyển đổi bằng Chuỗi ($ 0.key). Bạn thu thập các phần tử được chuyển đổi thành một chuỗi các chuỗi.


-2
// Old version (for history)
let keys = dictionary.keys.map { $0 }
let keys = dictionary?.keys.map { $0 } ?? [T]()

// New more explained version for our ducks
extension Dictionary {

    var allKeys: [Dictionary.Key] {
        return self.keys.map { $0 }
    }
}

2
Này đó! Mặc dù đoạn mã này có thể là giải pháp, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
Cánh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.