从可选的通用扩展返回 nil
Returning a nil from an optional generic extension
这是我正在玩的东西。问题是我有一个容器 class,它有一个通用参数,它定义了从闭包中编辑的类型 return。我想添加一个函数,该函数仅在泛型类型是可选的并且该函数 return 包含 nil 的实例时才可用。
这是我目前正在使用的代码(无法编译):
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()
就泛型而言,函数比属性强大得多。
Update经过一番考虑,可以有static属性,只需要在OptionalType
中添加一个关联类型,这样就可以了d 知道通用参数有什么样的可选:
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
。
这是我正在玩的东西。问题是我有一个容器 class,它有一个通用参数,它定义了从闭包中编辑的类型 return。我想添加一个函数,该函数仅在泛型类型是可选的并且该函数 return 包含 nil 的实例时才可用。
这是我目前正在使用的代码(无法编译):
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()
就泛型而言,函数比属性强大得多。
Update经过一番考虑,可以有static属性,只需要在OptionalType
中添加一个关联类型,这样就可以了d 知道通用参数有什么样的可选:
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
。