0

ここに基本的なセットアップがあります

var preferenceSpecification = [String : String?]()
preferenceSpecification["Key"] = "Some Key"
preferenceSpecification["Some Key"] = nil
preferenceSpecification["DefaultValue"] = "Some DefaultValue"
print(preferenceSpecification)
var defaultsToRegister = [String : String]()

if let key = preferenceSpecification["Key"], let defaultValueKey = preferenceSpecification["DefaultValue"] {
    defaultsToRegister[key] = preferenceSpecification[defaultValueKey]!
}

しかし、エラーは、これを強制的にアンラップする必要がある場所を指摘しています。

defaultsToRegister[key!] = preferenceSpecification[defaultValueKey!]!

keyValuedefaultValueはすでにラップ解除されているため、これは意味がありません

4

2 に答える 2

2

下付き文字を使用して、このような辞書から値を抽出すると

[String: String?]

オプションの 2 つのレベルを管理する必要があります。最初のものは、添え字がオプションを返すためです。2 つ目は、辞書の値がオプションの文字列であるためです。

だからあなたが書くとき

if let value = preferenceSpecification["someKey"] {

}

オプションの文字列として定義された値を取得します。

これを修正するコードは次のとおりです

if let
    optionalKey = preferenceSpecification["Key"],
    key = optionalKey,
    optionalDefaultValueKey = preferenceSpecification["DefaultValue"],
    defaultValueKey = optionalDefaultValueKey,
    value = preferenceSpecification[defaultValueKey] {
    defaultsToRegister[key] = value
}

提案

  1. 強制アンラップはできるだけ避けるべきです。代わり!に、1 行に 3 を配置することができました。
  2. また、定数と変数にはより適切な名前を使用するようにしてください。
于 2016-08-18T19:58:43.853 に答える