gpt4 book ai didi

ios - 来自 JSONJoy 协议(protocol)的 Swift init 方法不可用作 Objective-C 选择器

转载 作者:行者123 更新时间:2023-11-28 07:12:15 25 4
gpt4 key购买 nike

我在为需要由 JSONJoy 协议(protocol)实现的 Swift init 方法获取 Objective-C 选择器时遇到问题。我希望能够获得 init 方法的选择器的原因是,我可以根据类名以编程方式实例化 Swift 类,这在 Swift API 中似乎是不可能的,因此需要深入到 Objective-C 以做吧。我正在使用 https://gist.github.com/BennettSmith/1613121 的例程打印出每个类及其父类的所有方法,并且选择器始终显示为“init”,但根据我的理解,它应该显示为“init:”,因为它有一个参数。

JSONJoy 协议(protocol)是:

public protocol JSONJoy {
init(_ decoder: JSONDecoder)
}

为了测试,我尝试创建自己的名为“TestProtocol”的协议(protocol)。以下是我的结果。

init(str: String) {}显示带有“initWithStr:”的选择器

required public init(str: String) {}仍然显示一个选择器 "initWithStr:"

去除协议(protocol)并使用方法签名“init(str: String)”直接在我的类中实现方法,它仍然显示为“initWithStr:”。

所有带有和不带有“TestProtocol”的上述测试都按预期生成选择器。

但是,无论我如何操作 JSONJoy 协议(protocol)签名,当我列出该类的选择器时,它总是显示为没有任何参数的普通 "init"。我尝试删除“_”并向协议(protocol)添加其他参数,但它仍然显示为“init”

最佳答案

要使 Swift 协议(protocol)在 Objective-C 中可用,您需要将 @objc 属性添加到协议(protocol)声明中。

您可以使用 respondsToSelector() 测试 Objective-C 方法签名,如以下 Playground 示例所示:

@objc protocol Foo 
{
init(_ someNumber: Int)
}

@objc(MYBar) class Bar : NSObject, Foo
{
required init(_ someNumber: Int)
{
println("Got \(someNumber)")
}
}

var bar = Bar(123)
bar.respondsToSelector("init:") // true
NSClassFromString("MYBar")?.alloc() // `Bar` instance

关于ios - 来自 JSONJoy 协议(protocol)的 Swift init 方法不可用作 Objective-C 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27996554/

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