オプショナルのmapの返り値は代入しなくてもよい?
swift - 勝手にnilが無視される挙動を使って安全? - スタック・オーバーフロー
では、ディクショナリ
におけるnilの削除挙動
の質問をしました。
同様のソースをここに再掲しますが、
let hoge: String? = nil
let foo: String? = "foo"
var dict = [String: Any]()
if let hoge = hoge {
dict["hoge"] = hoge
}
if let foo = foo {
dict["foo"] = foo
}
print(dict) // => ["foo": "foo"]
やはり if let
の連続が書きにくいし、読みにくい。
なんとかして別の手段はないかと思い map
を試しました。
let hoge: String? = nil
let foo: String? = "foo"
var dict = [String: Any]()
hoge.map{ dict["hoge"] = $0 }
foo.map{ dict["foo"] = $0 }
これで目的が達成できたように感じます... しかしここで疑問が...
- 質問1. mapは返り値をなにかに代入する目的のもののはず、この使い方は正しいのか?
- 質問2. なぜ
Result of call to 'map' is unused
の警告はでないのか?
蛇足ですが、質問2の警告がたまたまXcodeの調子で出ないだけかと思い、
func bar() -> String? {
return "f"
}
という関数を作ってみたところ添付画像のように警告は出ていました。
さらに蛇足ですが、なぜ bar関数
の戻り値をString?
とオプショナルにしたかというと、
map
の定義が下記のようになっていたので -> U?
の部分に似せることができるかと考えたためです。
public func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?
(ただし、私がクロージャとジェネリクスが混合して書かれた型の読み方に慣れておらず、なにか勘違いしている可能性があります...)