【问题标题】:Swift - Generic function parameter [duplicate]Swift - 通用函数参数
【发布时间】:2017-08-03 04:57:55
【问题描述】:

我正在尝试这样做:

protocol Fly {
}

class Bird: Fly {
}

func fetch<T: Fly>(model: T) {
    print("Done")
}

let bird: Fly = Bird()
fetch(model: bird)

但是我得到了这个错误:

无法使用“(模型:Fly)”类型的参数列表调用“获取”

我将let bird: Fly = Bird() 设置为Fly 类型,因为函数fetch 采用任何符合该协议的对象,它不应该工作吗?

有什么想法吗?

【问题讨论】:

  • 如果您使用协议,则执行此操作的语法为 func fetch&lt;T&gt;(model: T) where T: Fly。我相信您输入的内容是用于子类化。但它仍然显示相同的错误。
  • @adev 感谢您指出这一点!是的,仍然认为同样的错误:(
  • 任何你不这样做的理由 -> func fetch(model: Fly) 可以正常工作,
  • 我将使用一个库,并且可能需要将此功能与它结合起来(除非没有必要,但目前不确定)。想看看我做错了什么,因为我没有使用泛型的经验

标签: swift xcode generics swift-protocols


【解决方案1】:

您正在使用 Fly 使用 Bird 实例创建对象

替换代码

protocol Fly {
}

class Bird: Fly {
}

func fetch<T: Fly>(model: T) {
    print("Done")
}

let bird: Bird = Bird() // Here is a problem 
fetch(model: bird)

【讨论】:

  • 我知道这一点,但是如果函数接受任何符合Fly 的实例,为什么我不能拥有这个let bird: Fly = Bird() 并将其传递给函数?
  • Fly 协议不确认 Fly 它自己。 Bird 确实
  • 哦,有道理。那么有没有办法让函数fetch接受任何类型的Fly?或者这没有意义 - 不确定?
  • 您可以将任何确认协议Fly 的类对象作为参数传递。
  • let bird: Fly = Bird() 非常好。我认为这不是问题所在。
【解决方案2】:

我将let bird: Fly = Bird() 设置为Fly 类型,它不应该工作吗,因为函数 fetch 采用任何符合该类型的对象 协议?

fetch(model: bird) 调用的重载解析是在编译时静态完成的。 bird 实例已被显式注释为 type Fly(它恰好是一个协议,可以动态地 保存符合它的实例)。由于protocols doesn't conform to themselves,对fetch(model: bird) 的调用将不能使用受约束的泛型方法func fetch&lt;T: Fly&gt;(model: T),因为bird 的类型,即Fly,不满足类型约束T: Fly

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-07
    • 2016-01-25
    • 2014-12-25
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多