2017-04-25 71 views
5

分配功能我有迅速的一类具有下列变量:斯威夫特:可变

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

斯威夫特然后告诉我:

Expected member name or constructor call after type name

它坚持认为,我在我的代码更改为:

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

我不知道这.self事情在做什么(抱歉,我是新来的斯威夫特)

然后我尝试分配pendingFunction到一个新的功能:

pendingFunction = function 

其中function需要两个双打,并返回一个双。

不过,我出现以下错误:

Cannot assign value of type '(Double,Double) -> Double' to type '((Double,Double)->Double).Type'

所以我的问题是:什么是.self事情做,我怎么能正确地分配给变量的函数吗?

+5

你会想'var pendingFunction:((Double,Double) - > Double)'声明一个函数类型的变量。 –

+1

'var pendingFunction:((Double,Double) - > Double)= {firstDouble,secondDouble in/* do you stuff here//}'then then let'let resultDouble = pendingFunction(double1,double2)' – ObjectAlchemist

+1

至于.self ,这意味着你正在分配函数的类型,而不是实际的函数。例如,'var someInt:Int'表示您将为其指定一个特定的Int值,而'var someInt = Int.self'则意味着您将它用作整体表示Int类型。 –

回答

10

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

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

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

你分配一个特定种类的功能作为值的变量的类型。据此,Swift推断变量的类型应该是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"