Swift2.0语法笔记

作为一个一直在玩Linux kernel的码农,从来不知道什么叫面向对象,也没有一点面向对象的概念,学Swift的时候还是感觉蛮不适应的,很多东西不一样。不像以前从Pascal转到C,只是书写的语法规则有点变化而已。C用久了,对指针、地址、内存的敏感性已经深入骨髓,突然看到这么个不怎么需要考虑内存的语言,有点儿混乱…… :-)
惭愧,一直懒懒散散,现在总算是把基础的语法部分学完了。不知道是不是因为C没有那么多面向对象的复杂用法的原因,我总想要慢慢把语法弄扎实,没有急着去做UI(其实心里还挺急的,哈哈),不知是走对了路还是舍近求远了
Swift自己也是个不断变化的语言,玩了一阵子,更新到2.0以后好多东西又不一样了,我也是挺晕的
这里把过程中的笔记写一写,主要是基于一个C程序员的角度,有些容易出错的地方以及和C的异同
练习源码见:GitHub 

首先很重要的一点:空格不能少!!养成习惯!

变量类型&数值计算

  • Float/Double/Int可强制用String()转换,通用类型转换可用”\(var)”,String转换Int可用Int()
  • 变量名大小写区分
  • 你看到的是非授权版本!爬虫凶猛,请尊重知识产权!

    转载请注明出处:http://conanwhf.github.io/2015/12/02/Swift_Syntax/

    访问原文「Swift2.0语法笔记」获取最佳阅读体验并参与讨论

  • 类型推断支持float=1+0.3, 但不支持float=int+0.3,即a=b(为一个整数变量)+0.3非法
  • 元祖类似于简单typedef,可定义不同类型数据为一组,但无指针和数组;强制类型定义不可与元素命名共存
  • 赋值语句不返回值,语句执行成功与否不能作为bool值赋给变量或作为判断条件,即succ=(b=a+1)非法
  • 求余运算%支持实数,但不准!!!因为是实数操作,能用二进制表示的正确,否则无法获取正确值。如(1 % 0.25) OK, (1 % 0.2)则结果不对(0.2无法准确表示的原因)
  • 基础数据类型都是结构体
  • 枚举的值是case名本身,而不是Int的另称

流程控制

  • if接受可选变量/绑定作为判断条件,assert不行
  • assert(bool, string)的意义表示条件不成立的话则退出,所以判断条件要写永远成立的那种;正式版中不起作用
  • for-in循环中间用来做index的变量不需要定义,在循环内部不可改变,即使定义为变量;跟C相似的for (;;)循环(事实上不需要括号)却相反:必须定义,循环内可变
  • case语句中,不需要写break,一个case后必须有语句;default则可以在case全范围覆盖条件时省略,否则必须写
  • case语句的判断条件可以重复,但只会执行第一个匹配
  • case中的fallthrough不能用在有有变量pickup的case中 
  • continue & break有一个类似goto的用法,可以跳转出不止一轮循环,但只能用于循环内

字符串

  • 不必关心内存,指针等问题,已封装
  • 大量API使用Foundation,即继承自oc
  • 与数组不同,其API中的Index是范型而不是整型
  • 字符串之间可以相加,字符不行
  • 每个字符都是一个可扩展的字母集(Extended Grapheme Clusters),可能由一个或多个Unicode标量构成,类似于偏旁部首组成一个字
  • 对于字符来说,不可使用+运算来组成字母集,即使相加也是几个字符而不会自动生成一个;但对于字符串,会自动归集
  • 使用()时,括号内不能有转义符,包括“”
  • 和C不同,字符串并非字符数组,在Swift里String.characters才是和数组类似的存在,拥有类似的属性和方法
       
    

    函数调用

  • 返回值可以为空(Void),Void实际上是一个空的元组
  • 参数可加外部参数名,有外部参数名的参数调用时必须全部强制使用外部参数;也可加默认参数值;有默认值的参数调用时必须加上外部参数名,除非强制用占位符_命名外部参数名
  • 可变参数最多一个且必须放在最后
  • 即使参数为var,也不可改变函数外的值,需要用inout(即传指针) 
  • C中函数本质为指针,指向入口;Swift中函数为Function Type变量,可以赋值,调用,作为参数传递,作为返回值等,只要参数&返回值定义匹配即可 

数组 & 字典 & 集合

  • 数组可以理解为一个相同元素链表
  • 可以使用arr[a…b]=[…]来做替换操作,甚至增加减少元素个数,但表达式中下标不能越界
  • 字典存储数据对,无序,不可用下标访问,但enumerate可以拿到一个index
  • 字典的key是唯一的,相当于有对应键值的关键字集合,对应的键值可以相同
  • 字典可以用.keys & .values来分别获取关键字和键值的数组,但只是罗列,不去重
  • 遍历数组用“for i in 0..\<arry.count”时, 记得别弄错区间!!
  • 如果没有指定类型,数组默认使用Object类型,本质上是OC的NSArray,且无法使用append(使用count&repeatedValue构造器除外,会自动推导类型)
  • [ [ [Type] ] ]申明的多维数组不是严格N维矩阵,相同维度上的元素数量可以不同,且可以通过赋值改变,更像是多维链表