【问题标题】:Swift: assigning function to variableSwift:将函数分配给变量
【发布时间】:2017-04-25 20:11:30
【问题描述】:

我有一个带有以下变量的 swift 类:

var pendingFunction = ((Double, Double) -> Double)

斯威夫特然后告诉我:

类型名称后的预期成员名称或构造函数调用

它坚持要我将代码更改为:

var pendingFunction = ((Double, Double) -> Double).self

我不知道这个 .self 是做什么的(对不起,我是 Swift 新手)

然后我尝试将pendingFunction 分配给一个新函数:

pendingFunction = function

function 接受两个 Double 并返回一个 Double。

但是,我收到以下错误:

无法将类型 '(Double,Double) -> Double' 的值赋给类型 '((Double,Double)->Double).Type'

所以我的问题是:.self 的作用是什么?如何正确地将函数分配给变量?

【问题讨论】:

  • 你会希望var pendingFunction: ((Double, Double) -> Double) 声明一个函数类型的变量。
  • 'var pendingFunction: ((Double, Double) -> Double) = { firstDouble, secondDouble in /* 你在这儿放东西吗*/ }' 然后调用它'let resultDouble = pendingFunction(double1, double2 )'
  • 对于 .self,这意味着您正在分配函数的类型,而不是实际的函数。例如,var someInt: Int 表示您将为其分配一个特定的 Int 值,而 var someInt = Int.self 表示您将使用它来表示整个 Int 类型。

标签: swift


【解决方案1】:

后缀.self 表达式只是指它的实例对象。有点像其他语言的.this。特别是对于类型,它告诉编译器您指的是类型本身,而不是指示它创建该类型的新实例。如果您想了解更多信息,可以在文档here 中阅读所有相关信息。虽然在很多情况下很有用,但这里并不真正需要它。

至于你的问题,当你分配时:

var pendingFunction = ((Double, Double) -> Double).self

您将特定类型函数的 type 分配为变量的 value。由此,Swift 推断出变量的 type 应该是Type。然后稍后当您尝试将适合该类型的实际函数分配为值时,它会引发错误,因为它需要一个类型,而不是一个函数。

您不想将类型分配为值,而是希望将该类型声明为变量的类型:

var pendingFunction: ((Double, Double) -> Double)

这是整个事情的一个例子:

var pendingFunction: ((Double, Double) -> Double)

func myAdditionFunction (first: Double, second: Double) -> Double {
    return first + second
}

pendingFunction = myAdditionFunction

print(pendingFunction(1,2)) // prints "3.0"

【讨论】:

  • 当我在 var 类定义位置插入这一行时,我得到一个编译器错误,它出现在另一个无辜的行上。 Xcode 11.3.
  • @DavidKramf 如果您显示错误、报告错误的无辜行以及您插入的行和位置会有所帮助。您可能需要将其作为新问题发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 2018-01-24
  • 2021-02-04
  • 1970-01-01
相关资源
最近更新 更多