我有以下方法:
private func returnNilIfEmpty<T: Collection>(_ collection: T?) -> T? {
guard let collection = collection else { return nil }
return collection.isEmpty ? nil : collection
}
我想扩展Collection
API 以使用计算变量来提取非空值,如下所示:
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 评论