这里的东西我与播放。的问题是,我有一个具有限定从闭合返回的类型的通用参数的容器类。我想补充一个函数,仅当他们泛型类型是可选的,有功能返回包含零一个实例。
下面是我目前正在打(这不会编译)的代码:
open class Result<T>: Resolvable {
private let valueFactory: () -> T
fileprivate init(valueFactory: @escaping () -> T) {
self.valueFactory = valueFactory
}
func resolve() -> T {
return valueFactory()
}
}
public protocol OptionalType {}
extension Optional: OptionalType {}
public extension Result where T: OptionalType {
public static var `nil`: Result<T> {
return Result<T> { nil } // error: expression type 'Result<T>' is ambiguous without more context
}
}
我想用这样的:
let x: Result<Int?> = .nil
XCTAssertNil(x.resolve())
任何想法如何使这项工作?
我不认为你可以用一个静态属性做到这一点,但是你可以用一个静态函数实现它:
extension Result {
static func `nil`<U>() -> Result where T == U? {
return .init { nil }
}
}
let x: Result<Int?> = .nil()
功能的方式更强大的性能相比,当谈到仿制药。
更新经过一番考虑,你可以有静态属性,你只需要添加一个相关联的类型OptionalType
,让你知道有什么样的可选通用参数:
protocol OptionalType {
associatedtype Wrapped
}
extension Optional: OptionalType { }
extension Result where T: OptionalType {
static var `nil`: Result<T.Wrapped?> {
return Result<T.Wrapped?> { nil }
}
}
let x: Result<Int?> = .nil
一个小小的缺点是,理论上它使任何类型的添加符合OptionalType
。