我尝试实现一个示例函数来返回一个函数。
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中很难编写。 谢谢!
答案 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 的函数的签名。