2016-05-02 8 views
0

Я пытаюсь создать главное меню для приложения Mac в качестве начальной задачи, чтобы узнать о Swift. Вот мой код, который не работает.Как передать массив пользовательских объектов в 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 никогда не вызывается.

Может кто-нибудь пролить свет на (возможно, очень простой) вопрос здесь? Заранее спасибо

ответ

1
let menuData = [getMainMenuItems] 

Эта линия (возможно) не делает то, что вы думаете, что он делает. То, что он делает, это создать массив типа [(Array<AnyObject>)->(AnyObject)] (массив функций, которые принимают в качестве входных данных массив AnyObjects и возвращают AnyObject) - и добавляет к нему свою функцию 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 с [MenuArrayObject]. Лучше быть таким же специфичным по типу, как вы можете в Swift (и почти всем другим языкам ООП), поэтому вам следует действительно уклоняться от AnyObject, если у вас нет веских оснований для его использования.

Теперь вы можете просто вызвать вашу функцию как это:

let menuData = getMainMenuItems() 

и он будет возвращать массив MenuArrayObjects.

Если вы пытаетесь сделать функцию так, чтобы она добавила объект в уже существующий массив, вы можете использовать inout parameter в своей функции. Это позволит вам передать массив в вашу функцию, которую он может изменить.

Например:

func getMainMenuItems(inout menuData:[MenuArrayObject]) { 

    let arrayObject1 = MenuArrayObject() 
    arrayObject1.title = "Project" 
    arrayObject1.subMenuTitles = ["New Project","Open Project","Save Project", "Quit Project"] 
    menuData.append(arrayObject1) 
} 

Вы можете назвать это так:

// an existing array of MenuArrayObjects 
var menuDataArray = [MenuArrayObject]() 

// call function with array – which it will append an element to 
getMainMenuItems(&menuDataArray) 
+0

Спасибо, это очень полезно и теперь он работает! – user1976727

+0

@ user1976727 С радостью помогите :) Я добавил дополнительную информацию о том, как вы, вероятно, будете использовать функцию 'getMainMenuItems' для моего ответа, если вам интересно. – Hamish

0

Код let menuData = [getMainMenuItems] просто создает массив, содержащий функцию. Я предполагаю, что вы хотите назвать функцию вместо этого. Это выглядит примерно так:

let menuData = getMainMenuItems([]) 
0

В applicationDidFinishLaunching вам нужно создать экземпляр menuArrayObject:

let myMenuArray = menuArrayObject() 

А потом называют это:

let menuData = myMenuArray.getMainMenuItems() 

Ваш метод getMainMenuItems, кажется, глядя на то, что вы написали в методе, должен быть определен как:

func getMainMenuItems() -> [AnyObject] 
Смежные вопросы