最近刚开始学swift,遇到了一个非常诡异的问题。是在写for循环的时候出现语法错误。代码如下:

for var i = 0; i < 10; i++{ println("hello world") }

按理说这是Swift里最简单的for循环的使用了。但是编译器还是报了两个错:

  1. ‘++ is not a binary operator’
  2. Operator is not a kNown binary operator

虽然苹果在官方文档里面说,建议通过++i这种方式使用自增运算符,但是依然可以查到相关资料证明,++运算符既是一个前缀运算符(prefix operator),也是一个后缀运算符(postfix operator)。取决于它相对于变量的位置。虽然它作为前缀运算符和后缀运算符的作用不完全相同,但是写在for循环里面按理说是没有任何问题的。

仔细查了一下苹果介绍“Lexical Structure”的文档,(抱歉不会翻译,姑且称之为词法结构吧)。点击前往文档地址

其中有一段话介绍了运算符的前缀、后缀特性,摘录如下:

The whitespace around an operator is used to determine whether an operator is used as a prefix operator,a postfix operator,or a binary operator. This behavior is summarized in the following rules:

If an operator has whitespace around both sides or around neither side,it is treated as a binary operator. As an example,the + operator in a+b and a + b is treated as a binary operator.

If an operator has whitespace on the left side only,it is treated as a prefix unary operator. As an example,the ++ operator in a ++b is treated as a prefix unary operator.

If an operator has whitespace on the right side only,it is treated as a postfix unary operator. As an example,the ++ operator in a++ b is treated as a postfix unary operator.

第一段话告诉我们,一个运算符到底被swift编译器当做前缀运算符还是后缀运算符处理,是有一套规则的。依据的就是运算符左右的空格。

下面三段分别解释了如何定义前缀运算符,后缀运算符和二元运算符。

在文章的最开始的例子中,注意到我们的写法是i++{ 。那么++运算符左右皆无空格,因此被定义为二元运算符(binary operator)。但是在Swift对++运算符的定义中,它只能作为前缀运算符或者后缀运算符使用。于是错误就发生了。

那为什么会报第二个错误——Operator is not a kNown binary operator呢?

因为Swift中可以自定义运算符,在swift编译器尝试使用++运算符失败后,还会试图把++{作为一个自定义的运算符来理解,但是由于我们并没有实现过这个运算符,所以会报出未知运算符的错误。

解决这个小问题有两种方案,一是改用++i运算。代码如下:

for var i = 0; i < 10; ++i{ println("hello world") }

参考第二条规则,++运算符被正确识别为前缀运算符。由于官方文档推荐在使用自编运算符的时候使用前缀运算符,所以这种方式是被推荐的。

或者只要在{和++运算符之间添加空格即可。由于我习惯了i++的用法,所以更倾向于使用这种解决方案,代码如下:

for var i = 0; i < 10; i++ { println("hello world") }

Swift在for循环中报错'++' is not a binary operator的更多相关文章

  1. ios – 等待异步方法在for循环中完成

    我有一个包含三个异步方法的for循环,我希望在这3个异步方法完成后进行一些处理.你有任何技术可以得到这个结果吗?

  2. Swift语法基础:17 - Swift的For循环, While, Do-While, If, Switch

    在Swift中,也有控制流,分别是For,For-In,For条件递增,While,Do-While等等,让我们一起来探讨一下:1.For循环在Swift中提供两种循环,一种是For-In,另一种是For条件递增,先来看第一种:如果你不需要知道范围内每一项的值,你可以使用下划线(_)替代变量名来忽略对值的访问:在前面数组和字典的遍历就已经举过例子了,所以这里就不再列举了.2.For条件递增在Swi

  3. Swift for 的几个例子

  4. [anyObject] 类型推断 Type Casting

    在swift中,如果遍历一个集合,可能就需要用到类型推断方式二:适合多种类型的混合,在for循环里,如果是多种类型,就进行多种类型的判断添加if-else

  5. 【swift】15-0521 控制流---for,while,do-while

    for-in循环for被乘数in1…5{println}let底=3let幂=10var结果=1for_in1…幂{结果*=底}println在数组与字典中循环打印出其中所有元素。)}elseif{println(“很遗憾遇到蛇,后退(-前进步数)!”)do-while循环—先执行一次循环体再判断

  6. Swift - Swift数组迭代

    依据不同情形,swift提供很多种方式对数组进行迭代比如有如下数组:1.通过变量递增的for循环2.使用Range操作符3.使用enumerate进行枚举

  7. swift 基础笔记七for循环

  8. Swift教程之循环语句

  9. Swift在for循环中报错'++' is not a binary operator

    是在写for循环的时候出现语法错误。点击前往文档地址其中有一段话介绍了运算符的前缀、后缀特性,摘录如下:Thewhitespacearoundanoperatorisusedtodeterminewhetheranoperatorisusedasaprefixoperator,apostfixoperator,orabinaryoperator.Thisbehaviorissummarizedinthefollowingrules:Ifanoperatorhaswhitespacearoundbothsi

  10. Swift - 流程控制

    switch分支语句switch语句由一个控制表达式和多个case标签组成。不存在隐式贯穿与C语言和Objective-C中的switch语句不同,在Swift中,当匹配的case分支中的代码执行完毕后,程序会终止switch语句,而不会继续执行下一个case分支。For循环Swift提供两种for循环形式以来按照指定的次数多次执行一系列语句:for-in循环对一个集合里面的每个元素执行一系列语句。Swift有四种控制转移语句:continue、break、fallthrough、return、throw

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部