【问题标题】:How can I specify to use a generic overloaded function in Swift?如何指定在 Swift 中使用泛型重载函数?
【发布时间】:2019-05-03 08:19:47
【问题描述】:

例如,我们有以下代码

func testFunc<T>(_ value: T) {
    // do something
}

// This overloaded function is provided on a newer version of SDK, we need to check the SDK version.
func testFunc<T>(_ value: T?) {
    // do something if we have an optional value
}

如果我有一个 optional 值,我如何指定我要调用 first 函数而不是 second 函数?这背后的基本原理是 second 功能可能仅在较新的 SDK 上可用,因此我需要备用。

【问题讨论】:

  • 确定是老版本的SDK,会调用老版本的函数吗?如果函数在 UIKit 中,我们可以在最新的 Xcode 中看到两者,但是使用可选值调用 testFunc 将自动解析为第二个函数。如果我们在第二个函数中添加可用性注释,Xcode 会报错。

标签: swift generics overloading


【解决方案1】:

Swift 尝试选择最具体的函数。 所以要调用testFunc&lt;T&gt;(_ value: T),你必须传递一个非可选的T。如果你传递一个可选的或强制解包的T 第二个函数testFunc&lt;T&gt;(_ value: T?) 将被调用。
你不能明确告诉编译器使用哪个重载函数,你只能修改参数,使它们与你要调用的重载函数完全匹配。

这个 sn-p 保证,testFunc&lt;T&gt;(_ value: T) 将被调用

let optional: Int? = 5
if let optional = optional {
   testFunc(optional)
}

【讨论】:

  • 我知道。在这种情况下,我想用可选值显式引用第一个函数testFunc&lt;T&gt;(_ value: T),这就是我要解决的问题。
  • 你不能明确告诉编译器使用哪个重载函数。您只能操作参数,以便调用正确的重载函数。
  • 我不确定。也许有解决办法?
【解决方案2】:
if let value = value {
    testFunc(value)
}

【讨论】:

  • 我想用可选值调用testFunc&lt;T&gt;(_ value: T)。有什么想法吗?
  • 是的,我在我的 sn-p func testFunc(_ value: T?) 中写了这个
  • 我的观点可能没有说清楚。当这两个函数都存在时,我想用可选值显式调用testFunc&lt;T&gt;(_ value: T)
  • 如果让值 = 值 {
  • 这似乎行不通。我们应该在 else 子句中添加什么?我们仍然需要检查第二个函数是否可用,如果不是,我们需要显式调用第一个函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 2021-06-14
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多