拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 SwiftCollectionAPI:使用计算变量扩展:型别错误

SwiftCollectionAPI:使用计算变量扩展:型别错误

白鹭 - 2022-03-14 2108 0 0

我有以下方法:

private func returnNilIfEmpty<T: Collection>(_ collection: T?) -> T? {
    guard let collection = collection else { return nil }
    return collection.isEmpty ? nil : collection
}

我想扩展CollectionAPI 以使用计算变量来提取非空值,如下所示:

extension Collection {
    var nonEmptyValue: Collection? {
        returnNilIfEmpty(self)
    }
}

但是,我收到错误:

这很清楚,因为外部Collection可以是任何集合(例如 an [Int]),而内部集合returnNilIfEmpty可以是例如 a String

问题是我如何强制执行相同型别Collection回传通过nonEmptyValue回传通过的规则returnNilIfEmpty,以便我可以摆脱这个编译器错误?

uj5u.com热心网友回复:

Self在这里使用是合适的

extension Collection {
    var nonEmptyValue: Self? {
        returnNilIfEmpty(self)
    }
}

例如Set([1,2,3]).nonEmptyValue如果你这样做了,你会期望得到 aSet<Int>?而不是一般Collection?(你甚至不知道这种型别包含什么样的元素或类似的东西!),不是吗?

uj5u.com热心网友回复:

UsingSelf解决了这个问题,因为它指向集合的具体型别:

import Foundation

extension Collection {
    var nonEmptyValue: Self? {
        returnNilIfEmpty(self)
    }
}

func returnNilIfEmpty<T: Collection>(_ collection: T?) -> T? {
    guard let collection = collection else { return nil } // nil -> return nil
    return collection.isEmpty ? nil : collection // return nil if empty
}

进一步简化:

import Foundation

extension Collection {
    ///
    var nonEmptyValue: Self? {
        self.isEmpty ? nil : self
    }
}
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *