我正在尝试为Mac应用程序创建主菜单,作为了解Swift的开始任务。这是我的代码,它不起作用。
在AppDelegate
中 import Foundation
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate
{
@IBOutlet weak var window: NSWindow!
//private let mainWindow = NSWindow(frame: NSWindow.mainScreen().bounds)
//let mainWindow = NSWindow()
//let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSSquareStatusItemLength)
func applicationDidFinishLaunching(aNotification: NSNotification)
{
// Insert code here to initialize your application
let menuData = [getMainMenuItems]
//[makeMainMenu, menuData]
}
}
然后在另一个名为Swift_FileManager
的项目文件中 import Foundation
import Cocoa
class menuArrayObject
{
var title: String = ""
var subMenuTitles: [String] = []
}
func getMainMenuItems (menuData:Array<AnyObject>) -> AnyObject
{
//Make a new menu array
var menuData = [AnyObject]()
let arrayObject1 = menuArrayObject()
arrayObject1.title = "Project"
arrayObject1.subMenuTitles = ["New Project","Open Project","Save Project", "Quit Project"]
menuData.append(arrayObject1)
return menuData
}
代码编译但函数getMainMenuItems
永远不会被调用。
有人可以解释(可能非常简单)这里的问题吗?提前致谢
答案 0 :(得分:1)
let menuData = [getMainMenuItems]
这条线(可能)并没有做你认为它做的事情。它正在做的是创建一个[(Array<AnyObject>)->(AnyObject)]
类型的数组(一系列函数,它们将AnyObjects
数组作为输入,并返回AnyObject
) - 并添加您的{ {1}}对它起作用。
根本没有调用你的功能。
为了调用函数,您需要使用包含所需输入的一对括号getMainMenuItems
。在这种情况下,您的()
方法需要一个getMainMenuItems
数组(尽管它似乎从未真正使用过它们)。
例如:
AnyObjects
尽管如此,我并不完全确定您的let menuData = getMainMenuItems([/* Insert your objects here */])
函数确实需要输入,因为您从未使用它。我认为你正在寻找这样的东西:
getMainMenuItems
请注意,该功能不再有输入,我已将func getMainMenuItems() -> [MenuArrayObject] {
// create an empty array of MenuArrayObjects
var menuData = [MenuArrayObject]()
let arrayObject1 = MenuArrayObject()
arrayObject1.title = "Project"
arrayObject1.subMenuTitles = ["New Project","Open Project","Save Project", "Quit Project"]
menuData.append(arrayObject1)
return menuData
}
替换为AnyObject
。最好是像Swift一样具体类型(以及几乎所有其他OOP语言),所以除非你有充分的理由使用它,否则你应该远离[MenuArrayObject]
。
现在你可以像这样调用你的函数:
AnyObject
,它将返回let menuData = getMainMenuItems()
的数组。
如果您正在尝试创建该功能,以便将对象添加到现有阵列,则可以在函数中使用inout
parameter。这将允许您将数组传递给您可以修改的函数。
例如:
MenuArrayObjects
然后您可以这样称呼它:
func getMainMenuItems(inout menuData:[MenuArrayObject]) {
let arrayObject1 = MenuArrayObject()
arrayObject1.title = "Project"
arrayObject1.subMenuTitles = ["New Project","Open Project","Save Project", "Quit Project"]
menuData.append(arrayObject1)
}
答案 1 :(得分:0)
代码let menuData = [getMainMenuItems]
只是创建一个包含该函数的数组。我猜你的意思是调用这个函数。这看起来像是:
let menuData = getMainMenuItems([])
答案 2 :(得分:0)
在applicationDidFinishLaunching中,你需要实例化menuArrayObject:
CURLcode ret;
CURL *hnd;
struct curl_slist *slist1;
std::string jsonstr = "{\"username\":\"bob\",\"password\":\"12345\"}";
slist1 = NULL;
slist1 = curl_slist_append(slist1, "Content-Type: application/json");
hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_URL, "http://u/r/l");
curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, jsonstr.c_str());
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.38.0");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, slist1);
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
ret = curl_easy_perform(hnd);
curl_easy_cleanup(hnd);
hnd = NULL;
curl_slist_free_all(slist1);
slist1 = NULL;
然后叫它:
let myMenuArray = menuArrayObject()
你的getMainMenuItems方法,看起来你在方法中写的内容,应定义为:
let menuData = myMenuArray.getMainMenuItems()