给定以这种方式定义的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
)的默认构造函数作为函数(没有定义新的函数/闭包)?
答案 0 :(得分:2)
您只需要将默认构造函数放在闭包中并将其传递给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)
答案 1 :(得分:0)
对我来说不太清楚你的意图,但也许你正在寻找像这样的构造函数:
extension S {
init (f: (a: String, b: Int, c: Bool) -> S) {
self = f(a: "foo", b: 1, c: true)
}
init(f: () -> S) {
self = f()
}
}