Swift 如何将XCTAssertNil与可选结构一起使用?

Swift 如何将XCTAssertNil与可选结构一起使用?,swift,xctest,Swift,Xctest,2016年3月23日更新我刚刚测试了下面的原始示例代码,它在XCode 7.3中编译得很好。看起来XCTAssertNil在更新过程中采用了类型为()throws->Any?的表达式,因此可能不再需要这个问题和答案(除了较旧版本的编译器) 我正在用XCode和XTest编写我的第一个单元测试。我不确定如何利用XCTAssertNil,因为它似乎只在使用某些类型时才编译。它似乎可以使用由类和内置原语生成的选项,但不能使用结构。如何使用这种方法 对于结构,编译器给出以下错误(假设“SimpleStr

2016年3月23日更新我刚刚测试了下面的原始示例代码,它在XCode 7.3中编译得很好。看起来XCTAssertNil在更新过程中采用了类型为
()throws->Any?
的表达式,因此可能不再需要这个问题和答案(除了较旧版本的编译器)

我正在用XCode和XTest编写我的第一个单元测试。我不确定如何利用XCTAssertNil,因为它似乎只在使用某些类型时才编译。它似乎可以使用由类和内置原语生成的选项,但不能使用结构。如何使用这种方法

对于结构,编译器给出以下错误(假设“SimpleStruct”是您的类型名称):

这里有一个简单的测试类来说明一些可以编译的类型和其他不能编译的类型

import Cocoa
import XCTest

struct SimpleStruct {
}

class SimpleClass {
}

class Tests: XCTestCase {

    func testl() {
        var simpleStruct:SimpleStruct? = nil;
        var simpleClass:SimpleClass? = nil;
        var i:Int? = nil;
        var s:String? = nil;
        var tuple:(Int,String)? = nil;

        XCTAssertNil(simpleStruct); // compile error
        XCTAssertNil(simpleClass); // OK
        XCTAssertNil(i); // OK
        XCTAssertNil(s); // OK
        XCTAssertNil(tuple); // compile error
    }

}

更新2016年3月23日针对XCode 7.3进行了更新(但是,如果您看到我对该问题的编辑,似乎不再需要此解决方案)

这里有一个解决办法。我创建了自己的通用函数:

func AssertNil<T>(@autoclosure expression: () -> T?, message: String = "",
               file: StaticString = #file, line: UInt = #line) {

    if (expression() != nil) {
        XCTFail(message, file:file, line:line)
    }
}
func AssertNil(@autoclosure表达式:()->T?,消息:String=“”,
文件:StaticString=#文件,行:UInt=#行){
if(表达式()!=nil){
XCTFail(消息、文件:文件、行:行)
}
}
这似乎不是必要的。这是否仅仅是XCTest最初针对Objective-C的结果,尚未对Swift进行足够的更新/桥接

编辑:我已经做了足够的研究,发现任何对象都可以用来表示任何类,但不能表示结构。然而,这并不能解释为什么我的原始帖子中的代码会编译为Int类型和String类型。(我在其他地方读到XCODE可以自动将这些转换为NSCONT和NSCONTY,这可能解释为什么。看,我会尝试删除我导入的可可,导入基础,看看会发生什么)

<>编辑:XCestType还导入基础,所以我不能测试我想要的。我可以创建自己的方法并进行测试。现在,我假设自动转换是允许int和string选项编译的。似乎XCTest还没有为Swift的黄金时间做好准备


2015年8月13日更新:将该功能编辑为与XCode 7 beta兼容

是的,看起来XCTest需要做一些工作。现在我的工作对我来说很好。我将更新消息,使其在出现故障时提供更多信息,而不是默认为空字符串。谢谢@Jeef。我将更新我的答案,以便调用注释。@Jeef我认为必要的更改是用新的变量替换文件和行变量?@Jeef已修复XCode 7.3
func AssertNil<T>(@autoclosure expression: () -> T?, message: String = "",
               file: StaticString = #file, line: UInt = #line) {

    if (expression() != nil) {
        XCTFail(message, file:file, line:line)
    }
}