【问题标题】:NSMenu subclassing in Swift 4Swift 4 中的 NSMenu 子类化
【发布时间】:2026-01-27 14:20:13
【问题描述】:

Objective-C 中的琐碎任务

- (instancetype)initWithTitle:(NSString *)title {
    return [super initWithTitle:title];
    //bool but_it_works_in_objective_c;
}

导致短路错误并提供建议: 返回时只允许 nil 值 >> Failable initializer 'init(title:)' 不能覆盖 non-failable initializer >> 返回时只允许 nil 值 ...

Screenshots with compiler errors from Xcode 9.3 (Swift 4.1)

Long 从 id 过渡到返回的 instancetype 似乎只是为了区分 init 初始化器系列中缺少返回的存在。 那么为什么这么明显的提示不能让它自动更正呢?

【问题讨论】:

  • 虽然 NSMenu 对目前的问题并不多,但通常仅作为最常见类型的示例,它恰好有用但不是 NSView

标签: objective-c swift4 appkit nsmenu swift4.1


【解决方案1】:

在 Swift 中,(不可失败的)init 方法不会返回任何内容,并且您不得更改指定初始化程序的签名

class MyMenu : NSMenu {

    override init(title: String) {
        super.init(title: title)
    }

    required init(coder decoder: NSCoder) {
        super.init(coder: decoder)
    }
}

【讨论】:

  • 是的,这是正确的,也是唯一的方法。转换到返回的 instancetype 似乎只是为了区分 unit 初始化器主体系列中返回的存在。为什么这么明显的提示无法自动更正?