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

Posted

技术标签:

【中文标题】条件绑定的初始化程序必须具有可选类型,而不是“字符串”【英文标题】:Initializer for conditional binding must have Optional type, not 'String' 【发布时间】:2015-12-22 11:10:05 【问题描述】:

这是我在更新到 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 方法的文档?它是否返回一个可选的?? 刚刚查了一下。不,它不返回可选值,但 relativeString 【参考方案1】:

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

【讨论】:

我们可以在这里使用守卫吗? @iPhone6 不,同样的原因你不能使用if let: 因为URL.absoluteString always 成功。没有什么需要防范的——absoluteString 是非可选的,永远不会是 nil【参考方案2】:

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

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

【讨论】:

URL: NSURL 不是可选项,不能为 nil。 这意味着在他的 textView 功能之外,为了清楚起见将编辑【参考方案3】:

注意:参考问题

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

【讨论】:

以上是关于条件绑定的初始化程序必须具有可选类型,而不是“字符串”的主要内容,如果未能解决你的问题,请参考以下文章

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

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

条件绑定的初始化程序必须具有可选类型,而不是“字符串”在干净构建后不起作用

ios:条件绑定的初始化程序必须具有可选类型,而不是“LOTAnimationView”

条件绑定的初始化程序必须具有可选类型,而不是 '[NSObject: AnyObject]' SwiftyJSON [重复]

条件绑定的初始化程序必须具有可选类型,而不是“UIView”