二进制运算符'==='不能应用于两个'String'操作数

时间:2016-01-27 13:42:11

标签: swift

为什么===不能和Swift中的String一起使用?我无法编译以下内容:

let string1 = "Bob"
let string2 = "Fred"

if string1 === string2 {
    ...
}

并获得以下错误(在if行上):

  

二元运算符'==='不能应用于两个'String'操作数

我希望在我的单元测试中能够做的是,执行了copyWithZone :,验证两个对象确实是一个具有不同指针的不同对象,即使它们的值相同。以下代码不起作用......

  

XCTAssertFalse(object1.someString === object2.someString)

如果有人知道另一种方式,请告知。

5 个答案:

答案 0 :(得分:8)

string1和string2不是NSString,而是String。由于它们是值对象而不是引用对象,因此没有可以与===进行比较的引用。

答案 1 :(得分:5)

默认情况下,Swift的===运算符仅为类定义。

Swift的String类型不是类,而是结构。它不会从AnyObject继承,因此无法通过引用进行比较。

您当然可以在Swift中为===实现String运算符,但我不确定它与Swift的==的实现有何不同{{1}输入。

String

当然,除非你真的想要比较引用,否则我想你可以这样做:

func ===(lhs: String, rhs: String) -> Bool {
    return lhs == rhs
}

但是,为了测试而不是使用func ===(lhs: String, rhs: String) -> Bool { return unsafeAddressOf(lhs) == unsafeAddressOf(rhs) } ==运算符,您应该使用适当的断言:

===

答案 2 :(得分:3)

===运算符是标识运算符。它检查两个变量或常量是否引用同一个类的实例。字符串不是类(它们是结构体),因此===运算符不适用于它们。

如果要检查两个字符串是否相同,请使用等于运算符==。

阅读Swift documentation中有关身份运营商的所有信息。

您可以直接检查两个对象的标识,而不是检查String类型的属性。

 XCTAssertFalse(object1 === object2)

答案 3 :(得分:2)

Swift字符串是值类型,而不是引用类型,因此没有必要,副本将始终是一个不同的对象。

您应该按值与==进行比较。

答案 4 :(得分:0)

如果你真的很努力,你可以强迫事情发生,但我不确定是什么让你买。

class MyClass: NSObject, NSCopying {
    var someString: NSString = ""

    required override init() {
        super.init()
    }

    func copyWithZone(zone: NSZone) -> AnyObject {
        let copy = self.dynamicType.init()
        copy.someString = someString.copy() as? NSString ?? ""
        return copy
    }
}

let object1 = MyClass()
object1.someString = NSString(format: "%d", arc4random())
let object2 = object1.copy()

if object1.someString === object2.someString {
    print("identical")
} else {
    print("different")
}

打印identical,系统非常善于保存字符串。