【问题标题】: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

标签: swift swift2 nsurl


【解决方案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 语句,在这种情况下它应该可以工作

【讨论】:

    猜你喜欢
    • 2018-11-06
    • 2016-01-29
    • 1970-01-01
    • 2018-12-20
    • 2019-03-11
    • 2017-01-22
    • 2018-03-25
    • 2016-01-08
    • 2017-04-08
    相关资源
    最近更新 更多