给定以这种方式定义的struct S
struct S {
let a : String
let b : Int
let c : Bool
}
和一个函数
func sConstructorFun(#a:String, #b:Int, #c:Bool) -> S {
return S(a:a, b:b, c:c)
}
我可以同时使用
sConstructorFun
和sConstructorFun(a:"", b:1, c:false)
来获得以下S(a:"", b:1, c:false)
值(当repl输出它时)S = {
a = ""
b = 1
c = false
}
因此,
S
和S
具有非常相同的界面,并且毫无疑问地返回相同的结果。但是,一个
sConstructorFun
函数定义如下func sFactory(f:(String, Int, Bool) -> S) -> S {
return f("foo", 42, false)
}
只能与
sFactory
一起使用,而不能直接与sConstructorFun
一起使用: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)
^
是否有任何方法可以将
S
(struct
在本例中)的默认构造函数用作函数(不定义新的函数/闭包来执行此操作)? 最佳答案
只需将默认构造函数放入闭包中,并将其传递给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)