二元运算符 += 不能应用于类型的操作数 [关闭]

Posted

技术标签:

【中文标题】二元运算符 += 不能应用于类型的操作数 [关闭]【英文标题】:Binary operator += cannot be applied to operands of the type [closed] 【发布时间】:2015-12-20 19:16:43 【问题描述】:

我有这个错误:

二元运算符 += 不能应用于该类型的操作数。

我该如何解决?

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) 
    if elementName == "item" 
        inItem = false
        objects += object
    

我在objects += object 线上遇到了这个错误

【问题讨论】:

欢迎堆栈溢出。由于您没有向我们展示objectsobject 的声明,并且您没有粘贴完整的错误消息(应该包括这两种类型),因此很难为您提供帮助。请编辑您的问题以包含该信息。 我真的很好奇为什么您确实从错误消息中删除了几乎唯一有用的信息。 对我的回答有任何回应吗?如果对你有帮助,你可以接受。如果还是不清楚,添加 cmets。 【参考方案1】:

您收到错误,因为您将 objectsobject 相加,并且此操作没有函数。

要使用任何运算符(+= 是运算符),您需要为其声明函数。这些是全局函数。这意味着它们不会被放入他们工作的类型中。下就好了。


这只是一个具有一些属性的类型。

class MyType 

    var myInt : Int = 0
    var myString : String = ""
    var myFloat : Float = 0

    init(int: Int, string: String, float: Float) 
        myInt = int
        myString = string
        myFloat = float
    


这些是操作员的功能。

第一个只是一个+,它返回一个MyType的新实例 请注意您需要如何组合所有有意义的属性。 例如,我没有取 myFloat 的总和,只取其他属性。

func +(lhs:MyType,rhs:MyType) -> MyType 
    let intSum = lhs.myInt + rhs.myInt
    let stringSum = lhs.myString + rhs.myString
    return MyType(int: intSum, string: stringSum,float: lhs.myFloat)

第二个使用inout 更改左侧实例(lhs)。此函数中没有return。由于左侧实例已更新。

func +=(inout lhs:MyType, rhs:MyType) 
    lhs.myInt += rhs.myInt
    lhs.myString += rhs.myString

注意这些函数如何期望两个相同类型的参数。如果objectsobject 不是同一类型(我猜可能是和ArrayDictionairy),那么您需要创建一个函数来获取两个不相关类型的总和。


这是另一种类型

class MyOtherType 

    var myDouble : Double = 0



这个函数使用运算符来取两个原本不相关的类型之和

func +(lhs:MyType,rhs:MyOtherType) -> MyType 
    let floatSum = lhs.myFloat + Float(rhs.myDouble)
    return MyType(int: lhs.myInt, string: lhs.myString, float: floatSum)


一些测试

如果你不写操作符函数你会得到这个:

let alpha = MyType(int: 20, string: "hello ", float: 0.5)
let beta = MyType(int: 22, string: "world", float: 0.75)
let delta = alpha + beta // error: binary operator '+' cannot be applied to two 'MyType' operands

如果你这样做:

let alpha = MyType(int: 20, string: "hello ", float: 0.5)
let beta = MyType(int: 22, string: "world", float: 0.75)
let delta = alpha + beta // 42, "hello world", 0.5

如果你不写算子函数用MyOtherType求和:

let alpha = MyType(int: 20, string: "hello ", float: 0.5)
let beta = MyOtherType()
let delta = alpha + beta // error: binary operator '+' cannot be applied to operands of type 'MyType' and 'MyOtherType'

在您的问题中包含objectsobject 的类型和声明非常重要。另外,请始终复制完整的错误消息,应该是这样的:

错误:二元运算符“+”不能应用于“MyType”和“MyOtherType”类型的操作数


如果objectsArray,您的求和函数将如下所示:

func +=<T where T : _ArrayType>(inout lhs:T, rhs:T.Generator.Element) 
    lhs.append(rhs)

【讨论】:

对不起,我不明白 :( @MicheleColadangelo 更新了,不懂的地方请解释一下。

以上是关于二元运算符 += 不能应用于类型的操作数 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

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

二元运算符“+”不能应用于“_”和“字符串”类型的操作数

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

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

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

二元运算符“==”不能应用于“字符串?”类型的操作数和 Swift 3 中的“布尔”