在以下 Swift 代码中:
import Foundation
struct MySet<T: Hashable>: CustomStringConvertible {
let set: Set<T>
}
extension MySet {
var description: String {
return "\(self.set)"
}
}
extension MySet where T: Comparable {
var description: String {
return "\(self.set.sorted())"
}
}
let intSet: Set<Int> = [6, 3, 4, 9, 12, 49, -1, 44, -1000, 1000]
let myIntSet = MySet(set: intSet)
print("myIntSet: \(myIntSet.description)")
print("myIntSet: \(myIntSet)")
print("myIntSet: ", String(describing: myIntSet))
我正在尝试创建一个自定义描述(针对 CustomStringConvertible 协议),该描述会根据集合中的元素是否可比较而有所不同。上面的输出是:
myIntSet: [-1000, -1, 3, 4, 6, 9, 12, 44, 49, 1000]
myIntSet: [9, -1, 3, 1000, 6, 4, 12, 44, 49, -1000]
muIntSet: [9, -1, 3, 1000, 6, 4, 12, 44, 49, -1000]
如您所见,如果我显式打印myIntSet.description
,我会得到所需的输出,即排序列表。但如果我在结构本身上使用字符串插值,或者String(describing: myIntSet)
,我会从第一个(无条件)扩展中获得描述。
有人能解释为什么会发生这种情况吗?如何获取字符串插值并String(describing: ...)
使用所需的描述?