gpt4 book ai didi

swift - #selector 与闭包不兼容?

转载 作者:搜寻专家 更新时间:2023-10-31 22:05:17 25 4
gpt4 key购买 nike

我尝试用闭包实现自定义函数。但 #selector 不支持它。

这是一个例子:

class Core: NSObject {

static let shared:Core = Core.init()


func button(viewController: UIViewController, button: UIButton, title: String, color: UIColor, completion: () -> Void) {

button.layer.cornerRadius = button.bounds.width / 2
button.setTitle(title, for: .normal)
button.setTitleColor(UIColor.white, for: .normal)
button.backgroundColor = color
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18)
button.addTarget(viewController, action: #selector(completion()), for: .touchUpInside)
}
}

Xcode 给我一个构建时间问题:

Argument of '#selector' does not refer to an '@objc' method, property, or initializer

最佳答案

选择器是一个字符串,用于标识 Objective C 运行时中的方法、属性和初始值设定项。当您使用像 #selector(SomeClass.SomeMethod(withParam:AndParam:) 这样的符号时,您是以编译器可以轻松解析并验证其正确性的格式指定选择器。但最终,这只会被简化为 C 字符串,例如:"SomeMethodwithParam:AndParam:"

本质上,每个类都有一个字典,它将选择器映射到实现它们的代码的函数指针。当使用选择器调用函数时,Objective C 运行时会在方法表中搜索相关类,并查找与给定选择器对应的方法实现。

这个过程无法使用闭包,闭包在定义上是匿名的。因此,您只能使用选择器来引用在 Objective C 运行时注册的方法、属性和初始化程序(这是 @objc 所做的,隐式或显式)。

关于swift - #selector 与闭包不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43485303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com