我有一个小的通用Swift结构,如下所示:
public protocol FilterOption: Equatable {
var name: String { get }
}
public struct Filter<T: FilterOption> {
public init(selected: [T], available: [T]) {
self.selected = selected
self.available = available
}
public static var empty: Filter<T> {
return Filter(selected: [], available: [])
}
public let available: [T]
public let selected: [T]
}
但是,除了回退或替代结果外,我在如何调用.empty
方面无所适从。
例如,如果myFilter
是nil
,则可以这样做:
let filter = myFilter ?? .empty
另一个示例是有条件的结果,如下所示:
let filter = useFilter ? myFilter : .empty
这些情况有效,并且仅是拥有empty
var的原因,但是我不知道如何创建一个空的过滤器。
例如,这不起作用:
let filter: Filter<UserFilter> = .empty
并失败,并显示错误消息'Filter' is ambiguous for type lookup in this context
。
这也不起作用:
let filter = Filter<Language>.empty
并失败,并显示错误消息Cannot specialize a non-generic definition
。
在创建空过滤器时如何提供类型信息?这有可能吗?
答案 0 :(得分:1)
实际上,该问题不需要单独的答案,因为只要正确满足通用占位符,代码就可以正常工作。我在问题中的评论应该可以挽救它。但是,正如您所问的那样,我已将我的评论转换为详细的答案。
您要提供给通用占位符的具体类型必须符合协议(在您的情况下为FilterOption
)。就像您定义的一样:
let filter = Filter<Language>.empty
确保您的Language
类型正确符合FilterOption
协议:
struct Language: FilterOption {
// Fulfill the requirements of the FilterOption protocol
}
一旦这样做,您就可以创建空过滤器。