顶层不允许使用表达式

Posted

技术标签:

【中文标题】顶层不允许使用表达式【英文标题】:Expressions are not allowed at the top level 【发布时间】:2015-09-27 23:33:30 【问题描述】:

我是 Swift 初学者。

以下代码似乎在 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")!))
    

将完全相同的代码粘贴到 OSX 的新 Cocoa 应用程序的“AppDelegate.swift”文件中时,出现 7 个错误,完全相同:“表达式不允许在顶层”。

通过搜索,我推断 Playground 允许正常项目不允许的事情,并且由于表达式“在类或实例方法之外”而发生错误。

但是我不确定如何修改程序才能正确构建。

【问题讨论】:

将变量声明移动到对象的方法中。你的 ApplicaitonDelegate 的 init 怎么样? 【参考方案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
    

【讨论】:

这很棒。它编译并正确运行,但它只是显示为空白的灰色窗口,没有加载网页(它应该加载 Apple 主页)。你能告诉我为什么或者我应该打开另一个问题吗?感谢您的快速回复! 从您在此处提供的代码中我最好的猜测是您有两个不同的windows。如果您打算将 webView 添加到标题为“Minimal Swift WebKit Browser”的窗口中,那么 _window 属性的存在和使用是错误的。您当然希望使用在applicationDidFinishLaunching() 中初始化和设置属性的window 局部变量。这就是需要添加子视图的窗口。 好的,谢谢。我可能不得不打开另一个问题,因为我刚刚注意到目标输出窗口中有消息,例如:“无法将(窗口)出口从(NSObject)连接到(NSWindow):缺少设置器或实例变量”但是谢谢你对这个问题的所有帮助!你肯定解决了我最初进来的目的。

以上是关于顶层不允许使用表达式的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中不允许在递归公用表表达式中使用 LIMIT

为啥在未计算的操作数中不允许使用 lambda 表达式,但在常量表达式的未计算部分中允许使用 lambda 表达式?

不允许使用源类型“动态”或具有“动态”类型连接序列的查询表达式

Visual Studio 即时窗口 - 不允许使用 Lambda 表达式 - 是不是有解决方法或替代方法? [关闭]

使用正则表达式的 FluentValidation 不允许 N/A 或 NA 忽略大小写和空格

Python中不允许使用空格进行正则表达式操作