2015-09-27 4 views
1

Я начинаю быстрый программист.Выражения не допускаются на верхнем уровне

Следующий код кажется компилировать штраф в Xcode 7.0 Playground (без видимых ошибок):

//: Playground - noun: a place where people can play 

//#!/usr/bin/env xcrun swift 

import WebKit 

let application = NSApplication.sharedApplication() 
application.setActivationPolicy(NSApplicationActivationPolicy.Regular) 
let window = NSWindow() 
window.setContentSize(NSSize(width:800, height:600)) 
window.styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask 
window.center() 
window.title = "Minimal Swift WebKit Browser" 
window.makeKeyAndOrderFront(window) 

class WindowDelegate: NSObject, NSWindowDelegate { 

    func windowWillClose(notification: NSNotification) { 
     NSApplication.sharedApplication().terminate(0) 
    } 
} 
let windowDelegate = WindowDelegate() 
window.delegate = windowDelegate 

class ApplicationDelegate: NSObject, NSApplicationDelegate { 
    var _window: NSWindow 

    init(window: NSWindow) { 
     self._window = window 
    } 

    func applicationDidFinishLaunching(notification: NSNotification) { 
     let webView = WebView(frame: self._window.contentView!.frame) 
     self._window.contentView!.addSubview(webView) 
     webView.mainFrame.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.apple.com")!)) 
    } 
} 

При вставке, что точно такой же код в файл «AppDelegate.swift» нового приложения какао для OSX, Я получаю 7 ошибок, все точно такие же: «Выражения не допускаются на верхнем уровне».

В результате поиска я понял, что игровая площадка допускает то, что обычные проекты не выполняют, а ошибки возникают, потому что выражения «вне метода класса или экземпляра».

Однако я не уверен, как программа может быть изменена для правильной сборки.

+1

Переместить объявления переменных в метод объекта. Как насчет инициализации вашей ApplicaitonDelegate? – ArtOfWarfare

ответ

1

Да, нормальные проекты не позволяют использовать код на верхнем уровне, потому что нет очевидного времени для его запуска. Вам нужно решить, когда должна выполняться ваша политика активации и код окна/делегата (т. Е. Переместить этот код внутри метода). Я предлагаю applicationDidFinishLaunching(_:), так как он называется, когда ваше приложение завершено, и это обычное место для этой настройки. Готовый код будет выглядеть так:

import WebKit 

class WindowDelegate: NSObject, NSWindowDelegate { 
    func windowWillClose(notification: NSNotification) { 
     NSApplication.sharedApplication().terminate(0) 
    } 
} 

class ApplicationDelegate: NSObject, NSApplicationDelegate { 
    var _window: NSWindow 

    init(window: NSWindow) { 
     self._window = window 
    } 

    func applicationDidFinishLaunching(notification: NSNotification) { 
     let webView = WebView(frame: self._window.contentView!.frame) 
     self._window.contentView!.addSubview(webView) 
     webView.mainFrame.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.apple.com")!)) 

     let application = NSApplication.sharedApplication() 
     application.setActivationPolicy(NSApplicationActivationPolicy.Regular) 
     let window = NSWindow() 
     window.setContentSize(NSSize(width:800, height:600)) 
     window.styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask 
     window.center() 
     window.title = "Minimal Swift WebKit Browser" 
     window.makeKeyAndOrderFront(window) 

     let windowDelegate = WindowDelegate() 
     window.delegate = windowDelegate 
    } 
} 
+0

Это замечательно. Он скомпилирован и работает правильно, но он просто отображается как пустое серое окно без загрузки веб-страницы (он должен загружать домашнюю страницу Apple). Можете ли вы сказать мне, почему или я должен открыть другой вопрос? Спасибо за быстрый ответ! – user5382807

+0

Мое лучшее предположение из кода, который вы здесь описали, состоит в том, что у вас есть два разных '' окна ''. Если вы намерены добавить свой «webView» в окно под названием «Минимальный Swift WebKit Browser», то существование и использование свойства '_window' ошибочно. Конечно, вы захотите работать с локальной переменной 'window', которую вы инициализируете и устанавливаете свойства в' applicationDidFinishLaunching() '. Это окно, в которое нужно добавить субвью. – andyvn22

+0

ОК, спасибо. Вероятно, мне придется открыть другой вопрос, так как я заметил, что есть сообщения в целевом выпадающем окне, например: «Не удалось подключиться (окно) от (NSObject) до (NSWindow): отсутствует setter или переменная экземпляра» Но спасибо за вашу помощь в этом вопросе! Вы определенно решили, к чему я изначально пришла. – user5382807

Смежные вопросы