代码之家  ›  专栏  ›  技术社区  ›  Daniel Saidi Sachin Rasane

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

  •  1
  • Daniel Saidi Sachin Rasane  · 技术社区  · 6 年前

    我有一个像这样的通用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 但是我不知道如何创建一个空过滤器。

    例如,这不起作用:

    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 回复  |  直到 6 年前
        1
  •  1
  •   nayem    6 年前

    实际上,这个问题不需要单独的答案,因为只要通用占位符得到了正确的满足,代码就可以正常工作。我在这个问题上的评论应该是可以挽救的。但正如你所要求的,我已经把我的评论转化成了一个详细的答案。

    您提供给通用占位符的具体类型必须符合协议(对于您的情况,它是 FilterOption )就像你定义的那样:

    let filter = Filter<Language>.empty
    

    确定你的 Language 类型正确符合 过滤选项 协议:

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

    一旦你这样做,你就可以很好地创建你的空过滤器。