Swiftで辞書のキーからの文字列で配列を埋めようとしています。
var componentArray: [String]
let dict = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("Components", ofType: "plist")!)
componentArray = dict.allKeys
これはエラーを返します: 'AnyObject'はstringと同一ではありません
また試した
componentArray = dict.allKeys as String
しかし、get: 'String'は[String]に変換できません。
スイフト3&スイフト4
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(_:)
initializerを使って簡単にArray
にマッピングできることに注意してください。
NSDictionary
から[String]
へ次のiOSのAppDelegate
クラスのスニペットは、keys
からNSDictionary
プロパティを使用して文字列の配列([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]
)を持つ辞書からkeys
プロパティを使用して文字列([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]
)を持つ辞書からkeys
プロパティを使用して文字列([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]
です。正確にはエラーメッセージが示すとおりです(もちろん、キー が all文字列であると仮定します。これは、あなたが言うときに主張していることとまったく同じです)。
そのため、Cocoa APIではcomponentArray
を[AnyObject]
と入力するか、dict.allKeys
をキャストする場合は[String]
にキャストします。これがcomponentArray
の入力方法です。
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
}
}
dict.keys.sorted()
[String] https://developer.Apple.com/documentation/Swift/array/2945003-sorted
NSDictionaryはクラス(参照渡し) 辞書は構造体(値渡し) ====== NSDictionaryからの配列======
NSDictionaryにはallKeysとallValuesが[Any]. 型のプロパティを持つ
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)
======辞書からの配列======
Dictionary'skeysおよびvaluesプロパティに関するアップルのリファレンス。
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)
公式の Array Apple documentation から:
init(_:)
-シーケンスの要素を含む配列を作成します。
Array.init<S>(_ s: S) where Element == S.Element, S : Sequence
s-配列に変換する要素のシーケンス。
このイニシャライザーを使用して、Sequenceプロトコルに準拠する他の型から配列を作成できます...たとえば、ディクショナリのキープロパティは、独自のストレージを持つ配列ではなく、アクセスされたときにのみディクショナリから要素をマッピングするコレクションであり、時間とスペースを節約します配列を割り当てるために必要です。ただし、配列を受け取るメソッドにこれらのキーを渡す必要がある場合は、この初期化子を使用して、そのリストを
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"]"
この答えは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()