假设有这样一个定义: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)作为一个函数使用(而不需要定义新的函数/闭包来完成)?
S = { a = "", b = 1, c = false }
中的意思。S
是结构体,然后你将S
用作左值。这个语法似乎不是有效的 Swift 结构。 - Matteo Piombofunc sConstructorFun(#a:String, #b:Int, #c:Bool) -> S
更改为func sConstructorFun(a a:String, b b:Int, c c:Bool) -> S
,因为我认为这意味着不同的东西。对此我深感抱歉,现在我会重新应用该编辑。 - Johannes Weiss