gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:42:22 25 4
gpt4 key购买 nike

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

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

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

'SimpleStruct' is not identical to 'AnyObject'

这是一个简单的测试类,用于说明一些可以编译的类型和其他不能编译的类型。

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)
}
}

这似乎不是必需的。这仅仅是 XCTest 最初针对 Objective-C 而没有针对 Swift 进行足够更新/桥接的结果吗?

编辑:我已经做了足够的研究,发现 AnyObject 可以用来表示任何类,但不能表示结构。但是,这并不能解释为什么我原来的帖子中的代码会针对 Int 类型和 String 类型进行编译。 (我在其他地方读到 Xcode 可能会为您自动将它们转换为 NSNumber 和 NSString,这可能会解释原因。请参阅 http://www.scottlogic.com/blog/2014/09/24/swift-anyobject.htmlhttp://www.drewag.me/posts/swift-s-weird-handling-of-basic-value-types-and-anyobject 。我将尝试删除导入 Foundation 的 Cocoa 导入,看看会发生什么)

Edit2:XCTest 还导入了 Foundation,所以我无法测试我想要的东西。我可以创建自己的方法并对其进行测试。现在,我假设自动转换是允许编译 int 和 string 选项的原因。似乎 XCTest 还没有完全准备好迎接 Swift 的黄金时间。

更新 8/13/2015:编辑函数以与 XCode 7 beta 兼容

关于swift - 如何将 XCTAssertNil 与可选结构一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26684207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com