鉴于此代码:
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
}
我在返回行上收到错误:&#34;无法转换类型&#39; T.T&#39;的返回表达式预期的回报类型&#39;&#39;&#34;。
将其更改为return T.defaultValue as! T
似乎有效,但这对我没有任何意义。我错过了什么或者我应该提交雷达吗?
答案 0 :(得分:7)
您可以在协议中使用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
}
或者,如果你想使用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
}
答案 1 :(得分:1)
在@ rintaro的答案的基础上,使用Self
类型defaultValue
表示typealias
是不必要的:
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
}
(我发现将defaultValue
的类型改为Self
使我的实施类不再符合协议了 - 我注意到我甚至没有提到typealias Value
;删除使我的实施类再次符合。)