Swiftのオプショナル型からBoolを返すメソッド呼ぶときの書き方

  • 14
    いいね
  • 7
    コメント
この記事は最終更新日から1年以上が経過しています。

Swift 1.1です。

例えばこんなクラスがあるとして、このURLがhttps://から始まってるかを判定したいとします。

class User {
  var url: String?
}

Swiftぽいかなと自分が思ってる書き方はこうだけど、ifがネストするのがちょっと嫌。elseがしんどい。

if let url = user.url {
  if url.hasPrefix("https://") {
    println("HTTPS!")
  }
}

これはコンパイルエラーになります。

if let url = user.url && url.hasPrefix("https://") {
  println("HTTPS!")
}

これもコンパイルエラー。戻り値がnil or Boolだからダメみたい。

if user.url?.hasPrefix("https://") {
  println("HTTPS!")
}

これは通るけど、、、、負けた気がする。美しくない!

if user.url?.hasPrefix("https://") == true {
  println("HTTPS!")
}

これもなんかオプショナル型の敗北を感じてしまうので間違ってる気がする。

if user.url? && user.url!.hasPrefix("https://") {
  println("HTTPS!")
}

Ruby on Railsならこれでいいのに

if user.url.try(:start_with?, "https://") 
  puts "HTTPS!"
end

どう書くのがいいんだろう。

追記

コメントで教えていただきましたが、swift 1.2ではif let whereでこの悩みが解決するそうです。
便利!そしてタイムリーな悩みでしたw

if let url = user.url where url.hasPrefix("https://") {
  println("HTTPS!")
}