使用Swift结构构造函数作为函数

约翰尼斯·魏斯

给定这样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)
         ^

有什么方法可以使用structS在此示例中)默认构造函数作为函数(无需为此定义新的函数/闭包)?

亚伦·拉斯穆森(Aaron Rasmussen)

您只需要将默认构造函数放在闭包内部,然后将其传递给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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用模板化结构作为构造函数参数

来自分类Dev

F#使用构造函数作为函数

来自分类Dev

结构作为函数中的参数与完成 - Swift

来自分类Dev

C使用构造函数创建结构数组

来自分类Dev

结构构造函数调用this()

来自分类Dev

C ++结构构造函数

来自分类Dev

C ++结构构造函数

来自分类Dev

结构作为构造函数参数(在main中声明)

来自分类Dev

使用接口作为构造函数参数

来自分类Dev

使用扩展对象作为构造函数?

来自分类Dev

使用colnames作为变量构造函数

来自分类Dev

使用可变对象作为构造函数参数

来自分类Dev

使用扩展对象作为构造函数?

来自分类Dev

构造函数使用空值作为参数

来自分类Dev

如何使用对象作为构造函数?

来自分类Dev

使用类构造函数作为函数创建线程

来自分类Dev

使用函数作为基对象构造函数的继承

来自分类Dev

尽管覆盖了默认结构,但仍使用结构默认构造函数

来自分类Dev

从库提供结构构造函数

来自分类Dev

C ++结构默认构造函数

来自分类Dev

Swift nsobjectype构造函数

来自分类Dev

Swift通用构造函数

来自分类Dev

Swift nsobjectype构造函数

来自分类Dev

调用构造函数作为方法

来自分类Dev

对象构造函数作为Javascript中的函数

来自分类Dev

Haskell构造函数作为函数变量

来自分类Dev

对象构造函数作为Javascript中的函数

来自分类Dev

如何使用WebAssembly构造函数定义Rust结构?

来自分类Dev

如何使用Haskell类型构造函数作为枚举?