Expressions are not allowed at the top level

Swift中,直接在类的外面调用类内部的方法,会出现Bug:Expressions are not allowed at the top level。

原因是:

  在App工程里, .swift 文件都是编译成模块的,不能有  top level code。

  先明确一个概念,一个 .swift 文件执行是从它的第一条非声明语句(表达式、控制结构)开始的,同时包括声明中的赋值部分(对应为 mov 指令或者 lea 指令),所有这些语句,构成了该 .swift 文件的 top_level_code() 函数。而所有的声明,包括结构体、类、枚举及其方法,都不属于 top_level_code() 代码部分,其中的代码逻辑,包含在其他区域,top_level_code() 可以直接调用他们。程序的入口是隐含的一个 main(argc, argv) 函数,该函数执行逻辑是设置全局变量 C_ARGC C_ARGV,然后调用 top_level_code()。不是所有的 .swift 文件都可以作为模块,目前看,任何包含表达式语句和控制语句的 .swift 文件都不可以作为模块。正常情况下模块可以包含全局变量(var)、全局常量(let)、结构体(struct)、类(class)、枚举(enum)、协议(protocol)、扩展(extension)、函数(func)、以及全局属性(var { get set })。这里的全局,指的是定义在 top level 。这里说的表达式指 expression ,语句指 statement ,声明指 declaration 。因此,如果代码中直接在类的外面调用类内部的方法,则该.swift 文件是编译不成的模块的,所以会编译报错。

时间: 2024-11-10 15:49:30

Expressions are not allowed at the top level的相关文章

swift错误 Expressions are not allowed at the top level

``` ... earlier we said top-level code isn't allowed in most of your app's source files. The exception is a special file named "main.swift", which behaves much like a playground file, but is built with your app's source code. The "main.swif

top level element is not completed

今天在使用IDEA配置springmvc文件时,出现类似在Android studio 中样式文件报top level element is not completed错,郁闷极了,找了好久 才找到解决方案,问题解决了  然而并没有理解为什么 ,希望有大神可以帮回复.问题类似如下: <resources> <!-- Base application theme. --> <style name="AppTheme" parent=""T

invalid nib registered for identifier (重用符) - nib must contain exactly one top level object which must be a UITableViewCell instance&#39;

通过xib创建cell的时候 一定要注意!!! 这个错误是在这个xib中在View同一层级出现了其他的控件,检查一下xib中左边的层级关系,让cell的view是唯一的控件就可以了,否则一执行 就会提示 "* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid nib registered for identifier (Cell) - nib must co

什么时候需要交换Top Level ?

什么时候需要交换Top Level ? 上一篇中提到,如果采用仿真的时候,运用门级仿真就需要进行顶层交换,RTL仿真不需要,那么什么时候需要呢? QuartusII 向下包含,在Project Navigator中可以查看到整个工程包含的module,在牵涉到硬件电路上的相关配置时,QuartusII 只会从这个Top Level中向下包含,所以在门级仿真的时候就必须交换到当前的顶层.在Top Level之外的module是不会被使用的. 但是在Files选项卡中会看到工程文件夹中所有的设计输入

Protobuf的奇怪问题解决--Expected top - level statement (e.g &quot;message&quot;)

最近天天都在玩Protobuf,因此,最近总结的问题过半都是关于它的.话说昨天遇到一个很奇怪的问题,转换.proto为java文件的过程中,报错:Expected top - level statement (e.g "message").截图如下: 查询问题原因,原来是由于编码格式的问题,因为,我使用UE打开了文件,并保存为UTF-8的形式.因此,会在文件的开头有一个特殊的字符,详见下图: 通过查找发现了问题的原因,由于我使用的是中文简体的windows,因此,他的默认编码为GB23

react 中使用import()实现按需加载报错 解决方法 --‘import’ and ‘export’ may only appear at the top level

因为项目需要搞一下按需加载,使用import实现代码打包分片按需加载,但是在实际使用中报语法错误.报错信息如下 SyntaxError: 'import' and 'export' may only appear at the top level 啊咧?报错了. 查找发现很多人碰到过,解决方法不同,但是我这个报错适用下边这个方法. npm install --save-dev babel-plugin-syntax-dynamic-import 然后调整babel-loader配置如下: use

关于idea中使用lamb表达式报错:ambda expressions are not supported at this language level

我使用的是jdk1.8,使用lamb表达式的时候,报错 ambda expressions are not supported at this language level, 后来,设置了 接着重启了项目,在使用的过程中依然报错,后来查阅资料,说虽然设置了,但是idea默认还是1.5,关键的是需要在pom.xml文件中添加: <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven

get top level domain by php

function rLastParse($str, $sep, $cnt = 1, $complete_if_not = false){ $i = strrpos($str, $sep); while (($cnt > 1) && ($i !== false)) { $i = strrpos(substr($str, 0, $i), $sep); $cnt--; } if ($i === false) { return $complete_if_not ? $str : ''; }

PAT (Top Level) Practise 1005 Programming Pattern (35)

后缀数组.排序之后得到height数组,然后从上到下将height>=len的都分为一组,然后找到第一组个数最多的输出即可. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #incl