使用Swift struct Constructor作为Function

时间:2015-02-16 17:05:56

标签: function swift struct constructor

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

因此SsConstructorFun具有完全相同的界面,并且不出所料地返回相同的结果。

但是,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)的默认构造函数作为函数(没有定义新的函数/闭包)?

2 个答案:

答案 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()
    }
}