【问题标题】:Swift type erasure / reification behavior?Swift类型擦除/具体化行为?
【发布时间】:2017-06-02 01:28:40
【问题描述】:

Swift 目前是否支持类型具体化?我无法让这个 sn-p 正常工作:

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

我错过了什么吗?

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

【问题讨论】:

  • 我认为这与 Swift 如何实现泛型有关。与 C++ 模板不同,Swift 中的泛型更像普通方法需要额外的类型参数。

标签: swift


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 2022-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多