【发布时间】:2016-07-09 19:42:57
【问题描述】:
在通过按 command+click 研究 XCTAssert 方法时,看起来它们的底层方法是一个具有类型(称为 T 的泛型类型,符合 Equatable 协议)的函数。我说的对吗?如果是这样,功能如何符合协议?函数是类型吗?
public func XCTAssertEqual<T : Equatable>(_ expression1: @autoclosure () throws -> ArraySlice<T>, _ expression2: @autoclosure () throws -> ArraySlice<T>, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line)
这一行是我在上面试图解释的最令人困惑的:
func XCTAssertEqual<T : Equatable>`
【问题讨论】:
-
这只是一个带有泛型类型参数的“普通”函数。是的,函数有类型,例如
() -> String或(Int, Double) -> [UIView]。 -
没有函数不能是类型。可以存储类型。函数不能。可以存储块。函数不能。您可以存储指向函数的指针,但不能存储函数本身。例如,我可以存储一个结构。我不能用函数来做到这一点。我只能存储一个指向它的指针。也没有通用函数指针(不是在 Swift 中)。因此,您不能将函数指针存储为 AnyObject 或 Any。您可以将 Objective-C 功能块 BitCast 到 AnyObject 并存储它,但您不存储函数。您正在存储一个包含指向函数的指针的 NSMallocBlock。
-
在 swift 中,您可以创建一个通用的包装器对象,该对象包含类型 T 以及调用任何函数的存储和块。当然,您必须将其转换回正确的类型。
-
@Brandon 请参阅我的答案的附录
标签: ios xcode swift function generics