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 Chaining
、array
属性返回可选类型,因此您的计数属性也返回可选对象。所以击球手用if let
或guard 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 类型的操作数