Swift 3:二元运算符不能应用于 int 和“Int”类型的操作数?

Posted

技术标签:

【中文标题】Swift 3:二元运算符不能应用于 int 和“Int”类型的操作数?【英文标题】:Swift 3 : binary operator cannot be applied to operands of type int and 'Int?' 【发布时间】:2017-05-19 06:47:44 【问题描述】:

尝试创建这样的 for 循环时出现错误

for i in  0..<firstJSON["boxGroups"].array?.count
   existingGroups.append(firstJSON["boxGroups"][0]["name"].stringValue)
 

Xcode 抱怨“二元运算符不能应用于 int 和 'Int?' 类型的操作数”

【问题讨论】:

【参考方案1】:

您面临的问题是因为Optional Chainingarray 属性返回可选类型,因此您的计数属性也返回可选对象。所以击球手用if letguard let包裹可选。

同样在for loop 中,而不是使用i 访问数组的每个对象,您只使用0 访问第一个对象。

if let boxGroupsArray = firstJSON["boxGroups"].array 
    for i in  0..<boxGroupsArray.count
         existingGroups.append(boxGroupsArray[i]["name"].stringValue)
    

有更好的选择使用flatMap 而不是for loop

if let boxGroupsArray = firstJSON["boxGroups"].array 
    existingGroups = boxGroupsArray.flatMap  $0["name"].string 
  

【讨论】:

如果existingGroups数组是可选的,也可以这样做:existingGroups = firstJSON["boxGroups"].array.flatMap( $0["name"].stringValue ) 我的意思是,如果 OP 希望数组是可选的,他可以这样做。如果不打算使用空数组,则为空数组分配内存是没有用的,应该是可选的,初始值是 nil。是的,您可以在可选数组上调用flatMap,而无需使用? 展开。 @Laffen 是的,我刚刚检查了它的工作,但如果你忽略 optional 的使用会更好,因为它会增加代码中的 optional chaining 也为了防止崩溃需要使用 @987654338 包装可选@ 或if let 我相信我们可以就这个主题进行一次漫长而有趣的讨论,但我猜你已经回答了 OPs 的问题 :)【参考方案2】:

试试这样:-

for i in  0..<firstJSON["boxGroups"].array!.count
   existingGroups.append(firstJSON["boxGroups"][0]["name"].stringValue)
 

【讨论】:

仅当您希望程序在第一次遇到 nil 数组时崩溃。【参考方案3】:

感谢您的回复-我想这是更好的方法:-)

for innerJSON in firstJSON["boxGroups"].array!                          
  existingGroups.append(innerJSON["boxGroups"].stringValue)

【讨论】:

这里的连击选项是使用flatMap 而不是for loop,查看我编辑的答案。此外,您的答案没有说明您收到此错误的原因。 那是个坏方法。如果firstJSON["boxGroups"].array 为 nil,您的程序将崩溃。 如果你像我一样解开可选数组,而不是强行包装它,我完全同意 JermyP。

以上是关于Swift 3:二元运算符不能应用于 int 和“Int”类型的操作数?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 为啥不能将二元运算符“===”应用于两个“日期”操作数?

Swift 二元运算符“+”不能应用于两个 CGFloat 操作数

二元运算符“==”不能应用于“布尔”和“字符串?”类型的操作数对于 2020 年的 Swift [重复]

二元运算符 % 不能应用于 UInt32 和 int 类型的操作数

解析 / Swift 问题与 tableviewcell“二元运算符'=='不能应用于单元格和 nil 类型的操作数”

二元运算符“===”不能应用于“任何?”类型的操作数和“UIBarButtonItem!”