【问题标题】:How to cast the generic result of a generic Swift method?如何转换通用 Swift 方法的通用结果?
【发布时间】:2021-12-06 03:00:14
【问题描述】:

假设我已经重载了这样的 Swift 方法

func someValue<T> ( _ name: PropertyName ) -> T? {
    // ...
}

func someValue ( _ name: PropertyName ) -> URL? {
    // ...
}

我可以这样调用这个方法

let u = o.someValue("propA")

u 将是URL? 类型。或者我也可以这样称呼它

let i: Int? = o.someValue("propB")
let s: String? = o.someValue("propC")

i 将是Int?s 将是String?

但是如何在不将其分配给变量的情况下使用此方法调用的结果呢?例如。我想在switch 语句中使用for 循环或者更简单:

switch o.someValue("propB") {

此调用将假定结果为URL?

switch o.someValue("propB") as? Int {

我被告知URL? 不能转换为Int,这是正确的。但是URL? 意味着一开始就已经调用了错误的方法。

更新
这是一个最小的测试用例,因为我不能在这里发布原始代码。

https://swiftfiddle.com/srkys22vofdqlpl2sglnfs4q5u

【问题讨论】:

  • let i: Int = o.someValue("propB") not 在我的测试中编译。但是let i: Int? = o.someValue("propB") 可以编译,switch o.someValue("propB") as Int? { ... } 也是如此。如果将泛型方法的返回类型更改为T,则let i: Int = o.someValue("propB")switch o.someValue("propB") as Int { ... } 都会编译。所以我看不到问题。我是不是误会了什么?
  • @MartinR 至于Int vs Int?,你当然是正确的,我错过了问号(实际上并没有复制代码,因为我必须快速混淆真实代码)但是这应该很明显,下面的句子指出i 的类型是Int?,这当然意味着类型限定符不能只是Int,对吧?
  • @Mecki:好吧,如果发布的代码没有揭示声称的行为,就很难回答。以及声明 “不起作用,也不起作用?整数还是整数?工作” 仍然不正确,因为它确实使用 as Int? 编译。

标签: swift generics


【解决方案1】:
switch o.someValue("propB") as Int? {

switch o.someValue("propB") as URL? {

工作正常。你说错了

没用


你也可以消除歧义

(o.someValue as (_ name: PropertyName) -> Int?)("propB")
(o.someValue as (_ name: PropertyName) -> URL?)("propB")

……虽然你不应该这样做。

【讨论】:

  • 嗯,你确实回答了这个问题,但没有明确回答,但是当你将它与我的版本进行比较时,你的第一行代码实际上揭示了问题。
  • 你的一个版本和我的一样。你不能用谎言和反对票来隐藏它,因为你的编辑历史就在那里。你说,“不起作用,as? Intas Int? 也不起作用。”。我不相信你真的尝试过你所说的,然后我说。
【解决方案2】:
switch o.someValue("propB") as? Int {

当编译器将其解释为时不起作用

(switch o.someValue("propB")) as? Int {

在这种情况下,URL? 返回方法获胜,这是最具体的重载,然后这种情况将失败,因为 URL? 不能大小写为 Int

然后指出,正确的代码需要是

switch o.someValue("propB") as Int? {

注意问号是如何移动到这里的唯一东西。现在演员阵容也可以匹配通用版本。 Jessy的回答的第一行基本上暗示了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多