gpt4 book ai didi

Array 上的 Swift 模式匹配

转载 作者:搜寻专家 更新时间:2023-10-31 22:07:33 24 4
gpt4 key购买 nike

swift 1.2
我正在尝试在一个以 Any 类型作为参数的函数中的 switch 案例中进行模式匹配,以便分派(dispatch)给一个更专业的私有(private) init。

这是一个 Playground 推断:

import Foundation

struct myStruct {
}

func switchOnAny(any: Any) -> String {
println("Dynamic Type == \(any.dynamicType)")
switch any {
case let array as [Any]:
return "Array"
case let array as NSArray:
return "NSArray"
default:
return "Default"
}
}

let emptyStringArray : [String] = []
let stringArray : [String] = ["Bob", "Roger"]
let intArray = [1, 2, 3]
let customStructArray : [myStruct] = []

println("\t\touput : \(switchOnAny([]))")
println("\t\touput : \(switchOnAny(emptyStringArray))")
println("\t\touput : \(switchOnAny(stringArray))")
println("\t\touput : \(switchOnAny(intArray))")
println("\t\touput : \(switchOnAny(customStructArray))")

产生以下输出:

Dynamic Type == __NSArrayI
ouput : NSArray
Dynamic Type == Swift.Array
ouput : NSArray
Dynamic Type == Swift.Array
ouput : NSArray
Dynamic Type == Swift.Array
ouput : NSArray
Dynamic Type == Swift.Array<__lldb_expr_37.myStruct>
ouput : Default

我想知道为什么 case as [Any] 没有得到它,因为我从不请求 NSArray?

我是否可以假设任何类型的 Swift 数组都将进入 NSArray 案例,或者我是否需要编写 2 个 case 语句(一个用于 NSArray,一个用于 [Any])以掩盖我的背部(显然会有需要)?


在进行更多测试后,我发现当我提供自定义结构数组时,没有任何模式匹配。我将需要像 [myStruct] 这样的匹配才能识别。这正是我要避免的,因为它只是我可以接受的选项之一。


为了提供更多背景信息,我已将我的项目放在 Github 上:https://github.com/VinceBurn/SwiftyPlist/tree/test/init-Any .该项目是关于 TDD 并将属性列表表示为可以通过下标访问的类似于树的结构。 (如 SwiftyJSON)

最佳答案

Swift 1.2

中,要最可靠地确定一个变量是否是任何类型的数组是使用反射
let array = []
let mirror = reflect(array)
let isArray = mirror.disposition == MirrorDisposition.IndexContainer

Swift 2.0 中:

let anArray = []
let mirror = Mirror(reflecting: anArray)
let isArray = mirror.displayStyle == .Collection

出于好奇,查看这些枚举很有趣:

enum MirrorDisposition { //Swift 1.2
case Struct
case Class
case Enum
case Tuple
case Aggregate
case IndexContainer
case KeyContainer
case MembershipContainer
case Container
case Optional
case ObjCObject
}

enum DisplayStyle { //Swift 2.0
case Struct
case Class
case Enum
case Tuple
case Optional
case Collection
case Dictionary
case Set
}

已更新这是一个完整的模式匹配示例:

func switchOnAny(any: Any) -> String {
println("Dynamic Type == \(any.dynamicType)")
switch any {
case let array as Any where reflect(any).disposition == MirrorDisposition.IndexContainer:
return "Any kind of array"
default:
return "Default"
}
}

关于Array<Any> 上的 Swift 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32156910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com