使用静态变量创建通用Swift实例

时间:2018-12-17 09:38:05

标签: swift generics

我有一个小的通用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方面无所适从。

例如,如果myFilternil,则可以这样做:

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

在创建空过滤器时如何提供类型信息?这有可能吗?

1 个答案:

答案 0 :(得分:1)

实际上,该问题不需要单独的答案,因为只要正确满足通用占位符,代码就可以正常工作。我在问题中的评论应该可以挽救它。但是,正如您所问的那样,我已将我的评论转换为详细的答案。

您要提供给通用占位符的具体类型必须符合协议(在您的情况下为FilterOption)。就像您定义的一样:

let filter = Filter<Language>.empty

确保您的Language类型正确符合FilterOption协议:

struct Language: FilterOption { 
    // Fulfill the requirements of the FilterOption protocol
}

一旦这样做,您就可以创建空过滤器。