Swift 如何检查实例是否实现了CollectionType?
我正在定义一个函数,它打印出Swift 如何检查实例是否实现了CollectionType?,swift,Swift,我正在定义一个函数,它打印出Any的一个实例。如果它是NSArray或CollectionType它会打印出它有多少个项目,最多10个项目: static func prettyPrint(any: Any) -> String { switch any { case is NSArray: let array = any as! NSArray var result: String = "\(array.count) items ["
Any
的一个实例。如果它是NSArray
或CollectionType
它会打印出它有多少个项目,最多10个项目:
static func prettyPrint(any: Any) -> String {
switch any {
case is NSArray:
let array = any as! NSArray
var result: String = "\(array.count) items ["
for i in 0 ..< array.count {
if (i > 0) {
result += ", "
}
result += "\(array[i])"
if (i > 10) {
result += ", ..."
break;
}
}
result += "]"
return result
default:
assertionFailure("No pretty print defined for \(any.dynamicType)")
return ""
}
}
static func prettyPrint(any:any)->字符串{
切换任何{
情况如下:
设array=anyas!NSArray
变量结果:String=“\(array.count)项[”
对于0中的i..0){
结果+=“,”
}
结果+=“\(数组[i])”
如果(i>10){
结果+=“,…”
打破
}
}
结果+=“]”
返回结果
违约:
assertionFailure(“没有为\(any.dynamicType)定义漂亮的打印”)
返回“”
}
}
我想为任何CollectionType
添加一个case子句,但我不能,因为它是一个涉及泛型的类型。编译器消息是:协议“CollectionType”只能用作一般约束,因为它具有自身或关联的类型要求
我只需要迭代并使用
count
属性来创建打印字符串,我不关心集合包含的元素的类型
如何检查
CollectionType
?您可以使用Mirror
-基于以下内容
func prettyPrint(any: Any) -> String {
var result = ""
let m = Mirror(reflecting: any)
switch m.displayStyle {
case .Some(.Collection):
result = "Collection, \(m.children.count) elements"
case .Some(.Tuple):
result = "Tuple, \(m.children.count) elements"
case .Some(.Dictionary):
result = "Dictionary, \(m.children.count) elements"
case .Some(.Set):
result = "Set, \(m.children.count) elements"
default: // Others are .Struct, .Class, .Enum, .Optional & nil
result = "\(m.displayStyle)"
}
return result
}
prettyPrint([1, 2, 3]) // "Collection, 3 elements"
prettyPrint(NSArray(array:[1, 2, 3])) // "Collection, 3 elements"
prettyPrint(Set<String>()) // "Set, 0 elements"
prettyPrint([1:2, 3:4]) // "Dictionary, 2 elements"
prettyPrint((1, 2, 3)) // "Tuple, 3 elements"
prettyPrint(3) // "nil"
prettyPrint("3") // "nil"
func预打印(any:any)->字符串{
var result=“”
设m=镜子(反射:任何)
切换m.displayStyle{
case.Some(.Collection):
result=“Collection,\(m.children.count)元素”
case.Some(.Tuple):
result=“Tuple,\(m.children.count)元素”
case.Some(.Dictionary):
result=“Dictionary,\(m.children.count)元素”
case.Some(.Set):
result=“Set,\(m.children.count)元素”
默认值://其他值为.Struct、.Class、.Enum、.Optional&nil
结果=“\(m.displayStyle)”
}
返回结果
}
预打印([1,2,3])/“集合,3个元素”
预打印(NSArray(数组:[1,2,3])/“集合,3个元素”
预打印(Set())/“Set,0个元素”
预打印([1:2,3:4])/“字典,2个元素”
预打印((1,2,3))/“元组,3个元素”
预印(3)/“无”
预打印(“3”)/“无”
查看有趣的是,Swift类型与Objective-C类型连接在一起,在这些情况下都会起作用。我用[String]尝试了你的函数,它成功了。有没有一种类型工作得不太好?@AdamCampbell它确实工作得很好,所以我想现在检查NSArray就足够了。我不知道“镜像”结构,我已经开悟了!