条件绑定的初始化程序必须具有可选类型,而不是'字符串'

时间:2015-09-24 18:18:48

标签: swift swift2 nsurl

这是我在更新到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
}

2 个答案:

答案 0 :(得分:46)

编译器告诉您不能使用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
}

答案 1 :(得分:0)

absoluteString不是一个可选值,它只是一个字符串。您可以检查URL变量是否为nil

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