条件绑定的初始化程序必须具有可选类型,而不是“字符串”
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 [重复]