swift + OS X 沙箱:将 'NSVBOpenPanel' 视为 'NSOpenPanel' :: 因为我需要在委托方法中获取发件人

swift + OS X sandboxing: treat 'NSVBOpenPanel' as a 'NSOpenPanel' :: because I need to get the sender in the delegate method

我正在使用 swift 并且我展示了一个 NSOpenPanel。在委托中我需要查看发件人的提示以区分要采取的操作:

例如

func show() {
    ... 
    panel.delegate = self
    panel.prompt = "xy"

    panel.run ....
}

func show2() {
    ... 
    panel.delegate = self
    panel.prompt = "abc"

    panel.run ....
}

//delegate
func panel(sender: AnyObject, shouldEnableURL url: NSURL) -> Bool {
    let panelPrompt = (sender as! NSOpenPanel).prompt       ... 
}

所以问题是我如何在 swift 中使用它而不会崩溃?
有什么好的方法还是只是 bug/ugly idk 行为
我必须恢复使用 performSelector 吗?

===

补充:NSOpenPanel 的扩展也不起作用!

这就是它与 performSelector 一起工作的方式。虽然很丑:

let panelPromptUnmanaged = (sender as! NSObject).performSelector(NSSelectorFromString("prompt"))
let panelPrompt = panelPromptUnmanaged != nil ? panelPromptUnmanaged.takeRetainedValue() as! String : ""

而不是将发件人转换为 NSOpenPanel(这失败了,因为 sender 是私有实例 NSVBOpenPanel class), 或者一些 performSelector 魔法,你可以使用这样的事实 可以在 AnyObject 上访问任意方法和属性 没有转换,并且调用的行为类似于隐式 展开可选:

func panel(sender: AnyObject, shouldEnableURL url: NSURL) -> Bool {
    let panelPrompt = sender.prompt ?? ""
    // ...
    return true
}

这给出了 any sender 对象的提示,该对象具有 prompt 属性,空字符串作为回退。在我的测试中它运作良好 在沙盒环境中。

有关更多详细信息、示例和参考资料,请参阅 文档。