为什么===不能和Swift中的String一起使用?我无法编译以下内容:
let string1 = "Bob"
let string2 = "Fred"
if string1 === string2 {
...
}
并获得以下错误(在if行上):
二元运算符'==='不能应用于两个'String'操作数
我希望在我的单元测试中能够做的是,执行了copyWithZone :,验证两个对象确实是一个具有不同指针的不同对象,即使它们的值相同。以下代码不起作用......
XCTAssertFalse(object1.someString === object2.someString)
如果有人知道另一种方式,请告知。
答案 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
,系统非常善于保存字符串。