Swift函数返回函数

时间:2014-06-18 06:04:43

标签: swift

我尝试实现一个示例函数来返回一个函数。

JS中的预期代码如下:

var class1 = function(val)
{
  var val1 = val;

  var obj = {
    say: function(val)
    {
      console.log(val1 + ' ' + val);
    }
  };
  return obj;

};

var obj1 = class1('hello');

obj1.say('ken');
obj1.say('tom');

在Swift中,该函数是一个第一类对象,但在JS中很难编写。 谢谢!

2 个答案:

答案 0 :(得分:4)

在这里,有点调整:

func mkGreeter(greeting: String) -> (String) -> () {
    return { name in println("\(greeting) \(name)") }
}

let greeter = mkGreeter("Hello")

greeter("Ken") // prints "Hello Ken"
greeter("Tom") // prints "Hello Tom"

mkGreeter返回一个“记住”greeting参数并且可以直接调用的函数。

答案 1 :(得分:1)

如果你想在Swift中复制你的Javascript代码,它将类似于以下内容:

struct Class1 {
  let val1: String

  init(_ val1: String) {
    self.val1 = val1
  }

  func say(val: String) {
    print(val1 + " " + val)
  }
}

let class1: (String) -> Class1 = { val1 in
  let obj = Class1(val1)

  return obj
}


let obj1 = class1("hello")

obj1.say("ken")
obj1.say("tom")

class1 变量包含要调用的函数,该函数接受 String 作为参数并返回 Class1的对象 类型。

Jean-Philippe Pellet 的解决方案略微调整一下,以便更清楚地说明:

typealias ReturnType = (String) -> ()

func class1(val: String) -> ReturnType {
  let returnFunction: ReturnType = { (val1: String) in
    print(val + " " + val1)
  }

  return returnFunction
}

let obj1 = class1("hello")

obj1("ken")
obj1("tom")

其中typealias ReturnType 表示接受字符串并返回 void 的函数的签名。