我是swift的新手,来自没有Obj-C背景的C ++,我找不到优雅的解决方案来解决一个小问题......
我使用NSOpenPanel来检索一些文件网址。
我的代码看起来像是:
let import_panel = NSOpenPanel()
import_panel.allowsMultipleSelection = true;
import_panel.canChooseDirectories = false;
import_panel.canCreateDirectories = false;
import_panel.canChooseFiles = true;
let import_panel_delegate = ImportPanelDelegate.init()
import_panel.delegate = import_panel_delegate
import_panel.prompt = NSLocalizedString("IMPORT_BUTTON_TEXT", comment: "")
let i = import_panel.runModal();
我想在我的应用程序的几个地方使用这个导入面板,所以我首先想到的是NSOpenPanel的子类创建一个“ImportPanel”。
class ImportPanel : NSOpenPanel{
init()
{
super.init()
self.allowsMultipleSelection = true
self.canChooseDirectories = false
self.canCreateDirectories = false
self.canChooseFiles = true
self.delegate = ImportPanelDelegate.init()
self.prompt = NSLocalizedString("IMPORT_BUTTON_TEXT", comment: "")
}
}
在这里,我面临编译错误,告诉我应该使用NSOpenPanel的“指定初始化程序”。 如果我理解的话,指定的初始化程序是一个显式设置多个参数的初始化程序。 但在这里,我不知道哪个初始化器使用。而且,我不知道如何为这些不同的初始化器填充参数!
我知道Swift更像是“面向协议的编程”而不是“面向对象的编程”,所以也许子类化NSOpenPanel不是正确的解决方案,但我无法弄清楚如何在这里使用协议。
所以,如果我想专攻NSOpenPanel,我应该怎么做?
先谢谢!
答案 0 :(得分:2)
这不是一般性答案,它仅针对NSOpenPanel
和NSSavePanel
:永远不会尝试将这两个类子类化
这两个类是特殊的,因为它们是沙盒实现的一部分,混乱它们,事情往往会破坏。
而不是子类化(或者,正如你所提到的,协议 - 尽管你可能在任何地方读到的东西都不是答案;-))设计一个类型(类或结构)来包装这些类并提供你的功能需要。即使用“有一个”而不是“是一个”。
或者,您可以编写创建或获取其中一个类的实例的函数,并执行所需的自定义。即甚至没有“拥有”,只是使用其标准API自定义实例。
每种方法都同样有效,选择适合用例的方法。
HTH