如何将Swift函数存储在变量中

zqdjd7g9  于 2023-11-16  发布在  Swift
关注(0)|答案(4)|浏览(119)
// Assume you have two functions.
// Swift considers these functions as distinct
func cars(left look: String) {}
func cars(right look: String) {}

// How can I store them in a variable for later use?
let c: (left : String) -> ()  = cars
let c2: (right : String) -> () = cars

字符串
当我试图将这些方法存储到一个变量中时,我得到一个错误,指出“汽车”是不明确的。我该怎么做才能区分它们呢?

qcbq4gxm

qcbq4gxm1#

你必须帮助编译器决定你想要哪个函数,因为它在决定一个函数的签名是否对赋值有效时并不区分参数名。
您可以通过指定参数名称来消除意图的歧义

let c:  (left :String) -> () = cars(left:)
let c2: (right:String) -> () = cars(right:)

字符串

rqdpfwrv

rqdpfwrv2#

你的两个函数有相同的一组参数string。为了能够有一个多态函数,每个函数必须有一组不同的parameter types

func cars( look: String) {}
func cars( look: Int) {}

字符串
你可以通过添加左和右描述来摆脱编译器,这是Roll-C的首选风格,但不是Swift。

gmol1639

gmol16393#

如果您已经有两个同名函数,并且无法更改

func cars(left look: String) { print(0) }
func cars(right look: String) { print(1) }

字符串
你需要把它们存储到两个变量中,你可以按照这个方法

let c0: (left : String) -> () = { cars(left:$0) }
let c1: (right : String) -> () = { cars(right:$0) }


正如你所看到的,我创建了两个闭包,它们分别调用第一个和第二个函数。

测试

c0(left: "") // 0
c1(right: "") // 1

bvn4nwqk

bvn4nwqk4#

func cars(left look: String) {}
func cars(right look: String) -> Int { return look.count }

var c:  (_ left :String) -> () = cars(left:)
var c2: (_ right:String) -> Int = cars(right:)

// Uses
print(c2("test"))

字符串

相关问题