NSURLとURLのイニシャライザに空文字を送った時に挙動が違う

Tuesday, September 27, 2016

空のURL文字列、ファイルパスなんて渡さないだろう」っていうツッコミはさておき、 NSURLURL それぞれに空文字を init(string:)init(fileURLWithPath:)に渡した時の挙動をみてみます。

挙動を確認してみる

playgroundでも良かったのですが、今回は適当なproject作って、AppDelegateでログ出力する形でサッと確認しました。

print(NSURL(string: "")) // 1
print(URL(string: "")) // 2
print(NSURL(fileURLWithPath: "")) // 3
print(URL(fileURLWithPath: "")) // 4

結果

  • 1(NSURL) -> Optional()
  • 2(URL) -> nil
  • 3(NSURL) -> クラッシュする
  • 4(URL) -> ./ – file:///

となりました。
特に、URL(string: "")nil を返すようになったので、以下のように force unwrap(!) を使っていた箇所を素直に書き換えて、空文字が渡ってしまった時は泣くことになります。

let urlString = ""
let url = NSURL(string: urlString)!

// ↓ Swift 3への書き換え
let url = URL(string: urlString)! // crash!!!

書き換えは慎重に

それぞれ挙動がNSのprefixが付いている/付いていないで異なるので、
Swift2からSwift3へ書き換える時は注意ですね。

techSwiftSwift3.0

Swift3への移行時に役に立ちそうなXcodeのOption

もようがえ