顶层不允许使用表达式
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 主页)。你能告诉我为什么或者我应该打开另一个问题吗?感谢您的快速回复! 从您在此处提供的代码中我最好的猜测是您有两个不同的window
s。如果您打算将 webView
添加到标题为“Minimal Swift WebKit Browser”的窗口中,那么 _window
属性的存在和使用是错误的。您当然希望使用在applicationDidFinishLaunching()
中初始化和设置属性的window
局部变量。这就是需要添加子视图的窗口。
好的,谢谢。我可能不得不打开另一个问题,因为我刚刚注意到目标输出窗口中有消息,例如:“无法将(窗口)出口从(NSObject)连接到(NSWindow):缺少设置器或实例变量”但是谢谢你对这个问题的所有帮助!你肯定解决了我最初进来的目的。以上是关于顶层不允许使用表达式的主要内容,如果未能解决你的问题,请参考以下文章
为啥在未计算的操作数中不允许使用 lambda 表达式,但在常量表达式的未计算部分中允许使用 lambda 表达式?
不允许使用源类型“动态”或具有“动态”类型连接序列的查询表达式
Visual Studio 即时窗口 - 不允许使用 Lambda 表达式 - 是不是有解决方法或替代方法? [关闭]