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

Posted

技术标签:

【中文标题】条件绑定的初始化程序必须具有可选类型,而不是“Bool”-firebase【英文标题】:Initializer for conditional binding must have Optional type, not 'Bool' - firebase 【发布时间】:2018-09-27 16:25:29 【问题描述】:

我刚刚将我的 Firebase pod 更新到了最新版本,我立即遇到了一些错误(不是震惊 :))。

我的应用将接收传入的动态链接并重定向它们,但我在if let linkHandled 收到错误

错误提示Initializer for conditional binding must have Optional type, not 'Bool'

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool 
    if let incomingUrl = userActivity.webpageURL 
        if let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingUrl, completion:  (dynamicLink, _) in
            if let dynamicLink = dynamicLink, let _ = dynamicLink.url 
                self.handleIncomingDynamicLink(dynamicLink: dynamicLink)
            
        ) 
            return linkHandled
        
    
    return false

在更新之前我没有出现此错误,有人知道出了什么问题吗?

谢谢。

【问题讨论】:

【参考方案1】:

使用可选绑定来确定一个可选是否包含一个值,如果是,则使该值可用作临时变量。在您的情况下,您不必在非可选 bool 上使用可选绑定:

let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingUrl, completion:  (dynamicLink, _) in
    if let dynamicLink = dynamicLink, let _ = dynamicLink.url 
        self.handleIncomingDynamicLink(dynamicLink: dynamicLink)
    
)

if linkHandled 
    return linkHandled

或者更简洁地说,根据 cmets 中 @LeoDabus 的建议,您可以在初始化 linkHandled 时使用 Swift 的尾随闭包语法:

let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingUrl)  (dynamicLink, _) in
    if let dynamicLink = dynamicLink, let _ = dynamicLink.url 
        self.handleIncomingDynamicLink(dynamicLink: dynamicLink)
    

你的整个函数看起来像:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool 
    if let incomingUrl = userActivity.webpageURL 

        let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingUrl, completion:  (dynamicLink, _) in
            if let dynamicLink = dynamicLink, let _ = dynamicLink.url 
                self.handleIncomingDynamicLink(dynamicLink: dynamicLink)
            
        )

        if linkHandled 
            return linkHandled
        
    
    return false

【讨论】:

您总是可以在方法之后使用 Swift 的尾随闭包语法并省略最后一个参数(完成)。 handleUniversalLink(incomingUrl) ... 我在更新的答案中提到了您的建议。

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

如何修复条件绑定的初始化程序必须具有可选类型,而不是“字符串”? [复制]

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

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

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

收到此错误:条件绑定的初始化程序必须具有可选类型,而不是“布尔”

Swift - 条件绑定的初始化程序必须具有可选类型,而不是 'PHFetchResult<PHAsset>'