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

Oli*_*ain 6 swift

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

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

if string1 === string2 {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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


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

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

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

gna*_*729 8

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


nhg*_*rif 5

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

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

你当然===可以String在Swift中实现一个运算符,但是我不确定它与==Swift String类型的实现有什么不同.

func ===(lhs: String, rhs: String) -> Bool {
    return lhs == rhs
}
Run Code Online (Sandbox Code Playgroud)

当然,除非你真的想比较参考文献,否则我想你可以这样做:

func ===(lhs: String, rhs: String) -> Bool {
    return unsafeAddressOf(lhs) == unsafeAddressOf(rhs)
}
Run Code Online (Sandbox Code Playgroud)

但是,为了测试,而不是使用=====运算符,您应该使用适当的断言:

XCTAssertEqual(foo, bar)
XCTAssertNotEqual(foo, bar)
Run Code Online (Sandbox Code Playgroud)