给定这样struct S
定义
struct S {
let a : String
let b : Int
let c : Bool
}
和一个功能 sConstructorFun
func sConstructorFun(#a:String, #b:Int, #c:Bool) -> S {
return S(a:a, b:b, c:c)
}
我可以同时使用sConstructorFun(a:"", b:1, c:false)
和S(a:"", b:1, c:false)
获取以下S
值(因为REPL输出它)
S = {
a = ""
b = 1
c = false
}
因此S
,sConstructorFun
具有相同的接口并且毫不奇怪地返回相同的结果。
但是,sFactory
函数定义如下
func sFactory(f:(String, Int, Bool) -> S) -> S {
return f("foo", 42, false)
}
只能与一起使用,sConstructorFun
但不能S
直接与一起使用:
REPL> sFactory(sConstructorFun)
$R2: S = {
a = "foo"
b = 42
c = false
}
和
REPL> sFactory(S)
repl.swift:18:1: error: cannot invoke 'sFactory' with no arguments
sFactory(S)
^
repl.swift:18:9: note: expected an argument list of type '((String, Int, Bool) -> S)'
sFactory(S)
^
有什么方法可以使用struct
(S
在此示例中)默认构造函数作为函数(无需为此定义新的函数/闭包)?
您只需要将默认构造函数放在闭包内部,然后将其传递给sFactory
函数即可。试试这个:
let f = { S(a: $0, b: $1, c: $2) }
func sFactory(f:(String, Int, Bool) -> S) -> S {
return f("foo", 42, false)
}
let s = sFactory(f)
println("s = (a: \(s.a), b: \(s.b), c: \(s.c))") // S = (a: foo, b: 42, c: false)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句