Swift 类型删除/具体化行为?

标签 swift

Swift 目前支持类型具体化吗?我无法让这段代码正常工作:

import Swift

protocol P { var name:String { get set } }

class A : P { var name:String = "A" }
class B : P { var name:String = "B" }
class C : P { var name:String = "C" }

func inspect(var p:P) { println("should only be C: \(p.name)") }
func inspect(var p:A) { println("a: \(p.name)") }
func inspect(var p:B) { println("b: \(p.name)") }

func failsToRetainType<T:P>(t:T) {
    print("inspecting \(t.name): ")

    //  let t = t.dynamicType
    inspect(t)
}

inspect(A())
inspect(B())
inspect(C())

failsToRetainType(A()) // expect A, get C
failsToRetainType(B()) // expect B, get C
failsToRetainType(C()) // expect C, get C

我错过了什么吗?

尽管如此,我已经看到另外两篇关于同一主题的帖子,但它们似乎更侧重于构建,并且可以通过创建相同类型的新实例来解决:

最佳答案

据我所知,您需要主动将泛型函数中的实例转换回特定类型:

func failsToRetainType<T:P>(t:T) {
    print("inspecting \(t.name): ")

    switch t {
    case let t as A: inspect(t)
    case let t as B: inspect(t)
    default: inspect(t)
    }
}

// inspecting A: a: A
// inspecting B: b: B
// inspecting C: should only be C: C

关于Swift 类型删除/具体化行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26900546/

相关文章:

swift - 使用map_Bump初始化SCNNode

ios - 使用 SWIFT 将 indexPath.row 传递给自定义单元格中的按钮

swift - 如何等待 Action 结束来执行 SpriteKit 中的函数?

swift - 尝试从 master 分支构建 swift 失败

ios - 互操作 Async/await、@MainActor 和 DispatchQueue.main.async

iphone - 在 Swift 中使用图像设置 map 注释

ios - 基于 subview 或自定义单元高度的自动布局单元

casting - 如何将 Array<AnyObject> 转换为空数组变量?

ios - 如何对 subview 进行动画处理,使其仅在框架范围内进行动画处理?

ios - 如何用 ReactiveCocoa 完成这个