提问人:DerrickHo328 提问时间:7/21/2016 最后编辑:DerrickHo328 更新时间:11/2/2023 访问量:9147
如何在变量中存储 Swift 函数
How To Store Swift function in a variable
问:
// 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
当我尝试将这些方法存储到变量中时,我收到一个错误,指出“cars”是模棱两可的。我能做些什么来区分它们?
答:
0赞
Christian Abella
7/21/2016
#1
您的两个函数具有相同的参数集 string。 为了能够具有多态函数,每个函数必须具有 一组不同的参数类型。
func cars( look: String) {}
func cars( look: Int) {}
您可以通过添加 left 和 right 来摆脱编译器 description,这是 Objective-C 的首选样式,但不是 swift 的首选样式。
0赞
Luca Angeletti
7/21/2016
#2
如果您已经有 2 个同名的函数,则无法更改
func cars(left look: String) { print(0) }
func cars(right look: String) { print(1) }
您需要将它们存储到 2 个变量中,您可以遵循这种方法
let c0: (left : String) -> () = { cars(left:$0) }
let c1: (right : String) -> () = { cars(right:$0) }
正如你所看到的,我创建了 2 个闭包,它们分别调用第一个和第二个函数。
测试
c0(left: "") // 0
c1(right: "") // 1
4赞
Alain T.
7/21/2016
#3
您必须帮助编译器确定所需的函数,因为在确定函数的签名是否对赋值有效时,编译器不会区分参数名称。
您可以通过具体参数名称来消除意图的歧义
let c: (left :String) -> () = cars(left:)
let c2: (right:String) -> () = cars(right:)
0赞
Jaydeep Patel
11/2/2023
#4
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"))
评论
0赞
Jeremy Caney
11/3/2023
感谢您对 Stack Overflow 社区的贡献。这可能是一个正确的答案,但提供代码的额外解释,以便开发人员能够理解你的推理,这将是非常有用的。这对于不熟悉语法或难以理解概念的新开发人员特别有用。为了社区的利益,您能否编辑您的答案以包含其他详细信息?
评论