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

标签 ios objective-c swift init

我在为需要由 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/

相关文章:

ios - 使 Controller 随着 iOS 中 UILabel 中文本的数量而扩展

ios - 使用 Swift 的 SpriteKit 中 presentScene 上的黑屏

iphone - 循环访问数据库中的坐标数组时出现问题

ios - Twitter Api 如何将 unicode 转换为字符串?

objective-c - 如何使用 self 创建对象?

ios - 非 ui 更新功能,例如读取 get 属性,是否需要在主线程中执行

swift - 为通用协议(protocol)实现提供具体类型

ios - UIView 中的动画 SVG

ios - 类似于 iMessage 的 Split View Controller 中的弹出 View Controller ?

ios - 来自 UICollectionViewCell 中的 Class 对象的 UITableView 数据源