【问题标题】:How to make switch on Type如何开启类型
【发布时间】:2019-02-15 02:58:36
【问题描述】:

我想对给定协议的类型做一个 switch 语句。假设我有:

protocol A {}

struct SA: A {}
struct SB: A {}

let aself: A.Type = SA.self
let bself: A.Type = SB.self

switch aself {
case is SA:
    break
default:
    break
}

我能以某种方式使这种开关起作用吗?这给了我警告,这种转换总是失败。这可以以某种方式完成吗?

【问题讨论】:

  • 你到底想用这个实现什么?
  • 有很多要解释的。简而言之,我有一个定义一些对象行为的基本引擎,在这个基类之上,我可以创建使用不同技术显示此内容的工作引擎。引擎为特定的任务使用不同的数据类型,base 使用这些类型调用函数。我尝试先使用泛型,但效果不佳,因此动态类型对我来说是更好的解决方案。

标签: swift types switch-statement


【解决方案1】:

你可以这样写:

switch aself {
case is SA.Type:
    print("is SA.Type")
default:
    print("Unknown type")
}

或者这个:

switch ObjectIdentifier(aself) {
case ObjectIdentifier(SA.self):
    print("is SA.Type")
default:
    print("Unknown type")
}

(一些代码解释了子类的不同行为,正如我在下面评论的那样。)

class CA: A {}
class CAA: CA {}

let caaself: A.Type = CAA.self

switch caaself {
case is CA.Type:
    print("is CA.Type") //->is CA.Type
default:
    print("Unknown type")
}

switch ObjectIdentifier(caaself) {
case ObjectIdentifier(CA.self):
    print("is CA.Type")
default:
    print("Unknown type") //->Unknown type
}

当您想在类型匹配中排除子类时,您可能需要使用ObjectIdentifier。 (可能还有其他方法,但我现在没有想到。)

【讨论】:

  • 谢谢:)。这就是我需要的。在我尝试使用 SB.self 而不是 .Type 之前。
  • @DamianDudycz,使用元类型并非易事。请记住,上面的两个代码在用于类(和子类)时会表现出不同的行为。
  • 您的意思是当针对超类进行测试时它会通过超类?还是别的什么?
  • @DamianDudycz,当CA 是一个类时,case is CA.Type 匹配CA 的所有子类。但case ObjectIdentifier(CA.self) 仅匹配CA.self
【解决方案2】:

我假设您还想使用强制类型转换值,在这种情况下您可以使用一些模式匹配:

switch aself {
case let a as SA.Type:
    break
default:
    break
}

如果您不想使用转换后的值:

switch aself {
case let _ as SA.Type:
    break
default:
    break
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2016-03-06
    相关资源
    最近更新 更多