条件绑定的初始化器必须是 Optional 类型,而不是 'String'

Initializer for conditional binding must have Optional type, not 'String'

更新到 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
}

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

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

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

注:参考问题

Guard or if 条件用于确保值不存在时它不应崩溃。但是函数参数确保 (URL: NSURL) 会出现,或者任何确保值确实出现的场景都不需要检查 if let 或 guard 语句。这就是编译器在教育开发人员。尝试删除 if let 或 guard 语句,在这种情况下它应该可以工作