给定以这种方式定义的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)
}

我可以同时使用sConstructorFunsConstructorFun(a:"", b:1, c:false)来获得以下S(a:"", b:1, c:false)值(当repl输出它时)
S = {
  a = ""
  b = 1
  c = false
}

因此,SS具有非常相同的界面,并且毫无疑问地返回相同的结果。
但是,一个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)
         ^

是否有任何方法可以将Sstruct在本例中)的默认构造函数用作函数(不定义新的函数/闭包来执行此操作)?

最佳答案

只需将默认构造函数放入闭包中,并将其传递给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)

07-24 09:15