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

Posted

技术标签:

【中文标题】条件绑定的初始化程序必须具有可选类型,而不是“字符串”在干净构建后不起作用【英文标题】:Initializer for conditional binding must have Optional type, not 'String' not working after clean build 【发布时间】:2021-01-28 17:32:44 【问题描述】:

干净构建后 swift 代码无法正常工作。

如何重写这个简单的代码?

if let name: String = String(cString: (interface?.ifa_name)!), name == "utun0" 
                    print("Ipfound")
                    ipFound = true;
                

我放了图片以便更好地理解。

【问题讨论】:

邮政编码作为文本而不是图像。对于 not 返回可选值的方法/构造函数,使用 if let ... 是没有意义的。此外,您不能先let 声明变量,然后再尝试为其赋值。 添加代码,而不是代码图片!我想在这里提供帮助,而不是复制你的代码,我正在输入它 是的,请编辑您的问题以包含您的(格式化)代码,而不是代码图片。为了提出修复建议,我不得不重新输入您的代码。 我很抱歉添加图片......不会再发生...... :) 【参考方案1】:

if let 构造用于可选的“条件绑定”。您尝试分配给 name(函数结果)的东西不是可选的 - 相反,您传递给 String(cString:,name:) 的值是可选的。

你应该把你的代码改写成这样:

if let interfaceName = interface?.ifa_name 
    let name = String(cString: interfaceName)
    if name == "utun0" 
       print("Ipfound")
       ipFound = true
     else 
       print("name != Ipfound")
    
 else 
    print("interface or interface.ifa_name is nil")

在该代码中,我使用可选绑定来尝试从 interface?.ifa_name 获取非零值。

如果您尝试使用!“强制展开”运算符,如果interface 为nil,或者interface.ifa_name 为nil,您的代码将崩溃。

编辑:

处理这个问题的另一种方法是在Optional 上使用map()

if let name: String = interface?.ifa_name.map ( String(cString: $0)),
     name == "utun0" 

    print("Ipfound")
    ipFound = true;

作用于 Optional 的 map() 形式将 Optional 作为输入。如果该可选项为 nil,则返回 nil。如果可选项不是 nil,map() 返回的结果是将闭包应用到未包装的可选项的结果。


【讨论】:

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

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

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

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

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

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

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