gpt4 book ai didi

swift - 如何从泛型函数调用 Swift 协议(protocol)的静态属性?

转载 作者:搜寻专家 更新时间:2023-10-30 22:09:56 24 4
gpt4 key购买 nike

给定这段代码:

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
}

我在返回行上收到错误消息:“无法将类型为‘T.T’的返回表达式转换为预期的返回类型‘T’”。

将其更改为 return T.defaultValue as! T 似乎有效,但这对我来说没有任何意义。我是不是遗漏了什么或者我应该提交雷达?

最佳答案

您可以在协议(protocol)中使用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
}

关于swift - 如何从泛型函数调用 Swift 协议(protocol)的静态属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29415481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com