如何在Swift中传递自定义对象数组

时间:2016-05-02 20:47:44

标签: arrays swift

我正在尝试为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永远不会被调用。

有人可以解释(可能非常简单)这里的问题吗?提前致谢

3 个答案:

答案 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()