Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 用于Swift中自定义对象的XCTASERTEQUAL_Ios_Unit Testing_Swift - Fatal编程技术网

Ios 用于Swift中自定义对象的XCTASERTEQUAL

Ios 用于Swift中自定义对象的XCTASERTEQUAL,ios,unit-testing,swift,Ios,Unit Testing,Swift,XCode 6,Beta 5 我有一个这样的单元测试: func testMyObjectsEqual() { //.... XCTAssertEqual(myObject, myOtherObject, "\(myObject) and \(myOtherObject) should be equal") } func testMyObjectsEqual() { //.... xctasertequal(myObject,myOtherObj

XCode 6,Beta 5

我有一个这样的单元测试:

func testMyObjectsEqual() { //.... XCTAssertEqual(myObject, myOtherObject, "\(myObject) and \(myOtherObject) should be equal") } func testMyObjectsEqual() { //.... xctasertequal(myObject,myOtherObject,“\(myObject)和\(myOtherObject)应该相等”) } XCTASERTEQUALOBJECTS在Swift中不再可用,因为该语言不区分标量和对象

因此,我们必须使用XCTAssertEqual,这会导致以下错误:

"Type MyObject does not conform to protocol Equatable" “类型MyObject不符合协议Equatable” 我发现的唯一解决方法是从NSObject继承(MyObject),以便执行以下操作:

XCTAssert(myObject == myOtherObject, "\(myObject) and \(myOtherObject) should be equal") xctasert(myObject==myOtherObject,“\(myObject)和\(myOtherObject)应该相等”)
因此,我的问题是:有没有一种方法(从beta 5开始)可以对自定义类型使用XctaserteQual,而不必依赖NSObject或使用“==”重载丢弃所有自定义类型?

如果要在Swift中比较引用,可以使用
==
运算符。这是当您从NSObject中生成子类时发生的情况(当您使用
xctasertequal
比较Objective-C中的对象时,您正在比较引用)

但这真的是你想要的吗

class MyObject {
    var name: String

    init(name: String) {
        self.name = name
    }
}

func testMyObjectsEqual() {
    let myObject = MyObject(name: "obj1")
    let myOtherObject = MyObject(name: "obj1")
    let otherReferenceToMyFirstObject = myObject

    XCTAssert(myObject === myOtherObject) // fails
    XCTAssert(myObject === otherReferenceToMyFirstObject) // passes
}
我想,在比较自定义对象时,可能应该使它们符合Equatable协议,并指定自定义对象相等的时间(在以下情况下,当它们具有相同的名称时,对象相等):


在比较自定义对象时,苹果公司明确表示,决定两个实例何时具有同等资格的责任落在开发人员身上。这就是他们引入Equalable协议的原因。但是,在比较引用类型的标识时,我们需要按照您的建议使用===运算符。我的问题是我们不能以这种方式使用XCTAssertEqual。在我看来,缺少了一个“XctasSertName”函数,它可以比较对象相等性。不过写起来很容易。我问了一个类似的问题,我想可能是重复的。从我所看到的情况来看,XCTAssertEquals不会触发==等价运算符。相反,对于自定义类,对于对象引用相等,它只返回true
class MyObject: Equatable {
    var name: String

    init(name: String) {
        self.name = name
    }
}

func ==(lhs: MyObject, rhs: MyObject) -> Bool {
    return lhs.name == rhs.name
}

func testMyObjectsEqual()
{
    let myObject = MyObject(name: "obj1")
    let myOtherObject = MyObject(name: "obj1")

    XCTAssertEqual(myObject, myOtherObject) // passes
}