鉴于此代码:
public protocol Selectable {
typealias T
var selected: Bool { get }
static var defaultValue: T { get }
}
public func selected<T: Selectable>(items: [T]) -> T {
if let selected = items.filter({$0.selected}).first {
return selected
}
return T.defaultValue
}
Run Code Online (Sandbox Code Playgroud)
我在返回行上出错:"无法将'TT'类型的返回表达式转换为预期的返回类型'T'".
改变它return T.defaultValue as! T似乎工作,但这对我没有任何意义.我错过了什么或者我应该提交雷达吗?
您可以Self在协议中使用:
public protocol Selectable {
var selected: Bool { get }
static var defaultValue: Self { get }
// ^^^^
}
public func selected<T: Selectable>(items: [T]) -> T {
if let selected = items.filter({$0.selected}).first {
return selected
}
return T.defaultValue
}
Run Code Online (Sandbox Code Playgroud)
或者,如果你想使用typealias,你必须:
public protocol Selectable {
typealias Value
var selected: Bool { get }
static var defaultValue: Value { get }
}
public func selected<T: Selectable where T.Value == T>(items: [T]) -> T {
// ^^^^^^^^^^^^^^^^^^
if let selected = items.filter({$0.selected}).first {
return selected
}
return T.defaultValue
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3199 次 |
| 最近记录: |