web-dev-qa-db-ja.com

条件付きバインディングの初期化子には、「String」ではなく「Optional」型が必要です

Swift 2.0に更新した後、私が直面している楽しい問題があります

エラーはif let url = URL.absoluteString行にあります

func myFormatCompanyMessageText(attributedString: NSMutableAttributedString) -> NSMutableAttributedString
{
    // Define text font
    attributedString.addAttribute(NSFontAttributeName, value: UIFont(name: "Montserrat-Light", size: 17)!, range: NSMakeRange(0, attributedString.length))

    return attributedString
}

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
    if let url = URL.absoluteString {
        if #available(iOS 8.0, *) {
            VPMainViewController.showCompanyMessageWebView(url)
        }
    }
    return false
}
29
mosaic6

コンパイラは、if letを使用することは完全に不要であるため使用できないと言っています。展開するオプションはありません。URLはオプションではなく、absoluteStringプロパティもオプションではありません。 if letは、オプションの展開にのみ使用されます。 urlという名前の新しい定数を作成する場合は、次のようにします。

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
    let url = URL.absoluteString
    if #available(iOS 8.0, *) {
        VPMainViewController.showCompanyMessageWebView(url)
    }
    return false
}

ただし、サイドノート:URLという名前のパラメーターとurlという名前のローカル定数を持つことは非常に紛らわしいです。次のようにした方が良いかもしれません:

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
    if #available(iOS 8.0, *) {
        VPMainViewController.showCompanyMessageWebView(URL.absoluteString)
    }
    return false
}
48
andyvn22

absoluteStringはオプションの値ではなく、単なる文字列です。 URL変数がnilかどうかを確認できます

if let url = yourURLVariable {
    // do your textView function
} else {
    // handle nil url
}
0
Chris Slowik