你什么时候使用 - > ()在斯威夫特?

时间:2015-01-06 00:10:48

标签: ios swift

学习Swift并遇到了这个例子。 () - >的目的是什么?在第一行服务中,您将如何在其他简单示例中使用它?

func buildIncrementor() -> () -> Int {
    var count = 0
    func incrementor () -> Int {
        ++count
        return count
    }
    return incrementor
}

var incrementor = buildIncrementor()

incrementor()
incrementor()

5 个答案:

答案 0 :(得分:6)

读作:

你正在创建一个不带参数的函数buildIncrementor并返回一个函数

-> ()

返回一个int:

-> Int

虽然我在编码时不会写这个,但我觉得我好像在读它:

func buildIncrementor() -> (() -> Int) {
    var count = 0
    func incrementor () -> Int {
        ++count
        return count
    }
    return incrementor
}

请注意附加的括号。这样看起来就像我说的那样:buildIncrementor返回另一个函数。 buildIncrementor返回的函数不带参数,并返回Int

答案 1 :(得分:4)

空元组()Void相同。您可以将其视为

func buildIncrementor() -> (Void -> Int)

返回类型buildIncrementor的函数Void -> Int,即闭包/函数,取Void(无)并返回Int

BTW功能可以简化为

func buildIncrementor() -> () -> Int {
    var count = 0
    return { ++count }
}

答案 2 :(得分:2)

buildIncrementor函数不执行任何操作并返回函数。返回函数的类型是() -> Int,这意味着什么都不返回Int。每当涉及箭头时,你正在处理函数或闭包。左边的东西是输入值和正确输出值上的东西。

答案 3 :(得分:1)

buildIncrementor()返回一个函数,因为它的返回类型。

  • ()表示 - 该功能不带任何参数
  • -> Int表示它返回一个Int作为它的返回类型。

总的来说,它类似于:

func buildIncrementor() -> (Void) -> Int
{
}

或以其他方式:

func buildIncrementor() -> ((Void) -> Int)
{
}


incrementor() // Will Return 1
incrementor() // Will Return 2

您可以阅读有关在Swift_Programming_Language/Functions

中返回功能的更多信息

答案 4 :(得分:0)

您的功能简明扼要地写为:

func incrementor (var value : Int = 0) -> () -> Int { 
   return { return value++ }
} 

函数incrementor接受一个参数value并返回() -> Int,它本身就是一个函数。无需命名内部函数incrementor;你可以简单地使用匿名'封闭'。您可以将其用作

var inc_from_10 = incremenator (value: 10)
inc_from_10()    // 10
inc_from_10()    // 11

返回函数的函数在像Swift这样的语言中很自然,其中函数是“一等”(可赋值给变量)。结合通用类型和一些复杂的形式成型。

// Return a function to test equality with an obj
func equate<T> (#pred: (T, T) -> Bool) (x:T) -> (T) -> Bool { 
   return { (y:T) in return pred (x, y) } 
} 

var equalToTen = equate (pred: ==) (x: 10)  // curry syntax

// Return a function to complement a predicate
func complement<T> (#pred : (T) -> Bool) -> (T) -> Bool {
  return { (x:T) in return !pred(x) }
}

var notEqualToTen = complement(equalToTen)

// Return a function conjoining two predicates
func conjoin<T> (#pred1: (T) -> Bool,  #pred2: (T) -> Bool) -> (T) -> Bool {
  return { (x:T) in pred1 (x) && pred2 (x) }
}

现在,您开始在reducemapfilter等序列函数中使用这些函数。