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就足够了。我不知道“镜像”结构,我已经开悟了!