我有以下方法:
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”只能用作通用約束,因為它具有 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
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/390694.html
