1、var 申明变量,let 申明常量, 变量会依据上下文辨认类型。
2、溢出操作符——&+,&-,&*,Swift 的哲学是触发陷阱比潜在安全漏洞要好
3、字符串反对插值 (var) 占位符,反对复合赋值操作符 += 连贯字符串
4、swift 必须手动转换类型,不会主动类型转换,譬如 int8+int16 会报错
5、switch 语法与 objc 差异很大,执行一个分支马上进行,不须要 break 语句跳出,反而想要穿透到上面分支还要用 fallthrough 语句。
switch 语句每一个分支不能空操作。
Switch 既反对一个值与给定值比拟,也反对多个值与给定值比拟,还反对区间值与给定值比拟,多个值用逗号分隔,区间则用三个点…来界定。
switch 反对值绑定,在 case 语句中申明变量或常量,其值绑定为状态码的值。switch 绑定值能够配合 where 语句应用,能额定查看一些条件,这个个性能够创立动静筛选条件。
6、元组——具备逻辑关联的两个或多个值的无限组合,反对索引拜访,也能够命名拜访,如:
var statusCode
var errorString
let error = (code:statusCode, description:errorString)
元组能够在 switch 的区间匹配中利用,下划线_可用作通配符,匹配任何值。
7、if-case 语法 为只有一个分支的 switch 语句提供优雅的替代品。
8、区间既可在 switch 语句中匹配应用,也能够在 for-in 循环中应用。
9、通配符_既能够在 switch 语句应用,也能够在 for-in 语句中代替迭代器,这样就能够疏忽迭代器。
10、for-in 循环反对 where 子句,如 for i in 1…100 where I%3==0 {}
Where 子句是用来代替 for-in 中的 if 条件判断,使代码看起来更优雅,是可代替的。
11、类型推断——依据上下文推断出实例的类型,不须要显式申明。有些状况下须要明确申明类型,但一般来说,倡议尽量利用类型推断。
12、repeat-while 代替了 do-while
13、导入 framework 形式如: import Cocoa
不须要 #符号,也不须要双引号“”或者尖括号 <>
14、字符串双引号前不须要 @符号
15、每个字符串都是一个 String 对象,尽管其自身不是一个汇合,然而其底层内容的确以汇合的模式存在,字符串的 characters 属性示意组成这个字符串字符汇合。
组成字符串的每个字符也是一个 Character 对象。
16、\u{}示意 Unicode 标量,十六进制数放在花括号里。每个字符都有一个或多个 Unicode 标量形成。一个 Unicode 标量对应一个根本字符。
多个 Unicode 标量形成的字符为组合标量,通常也有有单个标量示意模式,而且其等价。
对于两个字符或者两个字符串,如果它们具备雷同的语言学含意和外观,无论是否用雷同的 Unicode 标量创立,都认为两者相等。
规范等价意味着无论用组合标量还是预组合标量,后果都会被当做单个字符。
17、swift 不容许间接用索引下标 [] 来拜访字符串中的指定字符,因为 swift 无奈在不遍历后面每个字符的状况下晓得指定的索引对应于哪个 Unicode 标量,该索引必须要先获取到 start 索引,再通过编译计算到指定索引。
18、swift 任何类型都能够用可空类型来阐明一个实例可能是 nil,而 objc- c 只容许对象是 nil
19、申明实例变量时,在类型后追随问号?, 则示意该变量是可空类型,能够为 nil,也能够赋了值。
20、实例变量后追随感叹号!, 其作用是强制开展,无论实例变量是否有值,都会拜访封装的值。感叹号!假如有这样一个值,如果没有,这样开展会产生运行时谬误。
string 实例变量和 string! 实例变量不是雷同的类型——如果你有一个 String 变量,就无奈在不开展可空实例的状况下将 String? 的值赋予给这个变量。
21、可空实例绑定——如果有值,就将其值赋予一个长期常量或变量,并且使这个常量或变量在条件语句第一个分支代码中可用。其语法与在条件语句中创立常量或变量统一,只是不须要再强制开展可空实例了,这个操作主动实现。
If let Instance = nilInstance, let Instance = nilInstance {}
22、申明实例变量时,在类型后追随感叹号!, 则示意该变量是隐藏式开展可空类型。隐式开展可空类型与一般可空类型重要区别就是不须要开展,应用上不须要 if 条件语句了。如果这种隐式开展可空类型没有值的话,拜访其值会间接导致运行时谬误。倡议如果某个实例可能为 nil,就不要应用隐式开展可空类型。
23、实例前面跟问号?——可空链式调用,与可空实例绑定相似,两者重要区别是,可空链式调用容许把多个查问串联为一个可空实例的值。
24、感叹号跟在实例前面,其作用就是断言实例不为空,若真为空就解体,相当断言成果。
25、nil 合并运算符?? 相似三目操作符?:
那么 guard 语句的作用到底是什么呢?顾名思义,就是守护。guard 语句判断其后的表达式布尔值为 false 时,才会执行之后代码块里的代码,如果为 true,则跳过整个 guard 语句。guard 语句中申明的实例能够在整个办法作用域中应用。
其语法:
guard 布尔表达式 case{执行代码}
——————————————————————————————————————————————————————————
1、swift 的 Array 类型能够持有任何类型的值——对象和非对象都能够。
2、申明数组次要有两种语法,数组实例也反对类型推断
var bucketList:[String]var friends:Array<String>var weeks = [“Monday”,”Tuesday”] ——字面量语法
var array = Array<String>()
var array = [Int]()
汇合 Set 语法与数组统一
3、申明字典语法,反对类型推断
var dict1:Dictionary<String,Double> = [:]var dict2 = Dictionary<String,Double>()var dict3:[String:Double] = [:]var dict4 = [String:Double]()var dict5 = [“name”:”shelton”,”age”:]
1.
Swift 与 obj- c 的字典区别,就是简化赋值 objc 用大括号{},swift 用中括号[]
4、汇合 Set 是无序,贮存元素惟一,数组有序,贮存元素能够反复,字典无序,但键值惟一。
5、Swift 函数反对嵌套,用元组语法来反对返回多个值,反对变长参数,反对参数带默认值。函数还容许有内部名与外部名。元组也能够作为函数参数
6、闭包就是 objc 中的 Block
闭包语法:
{(参数)-> 返回类型 in// 代码}
1.
闭包能够利用 swift 的类型推断零碎去除参数和返回值的类型信息来简化闭包。
如果闭包代码只有一行表达式,return 关键字也能够省略。
闭包甚至能够利用快捷参数名来代替显式申明的参数,做到剔除参数申明来简化闭包。0 示意第一个参数,1 示意第二个参数。
尾部闭包语法甚至能够省略掉办法的圆括号。
闭包和函数能记录在其闭合作用域中定义的变量所封装的外部信息。
闭包是援用类型。
func greeting(_ greeting:String) -> (String)->String {
return {(name:String) -> String in
return “(greeting) (name)”
}}
下面函数,有一个 String 参数,后果返回一个函数,不须要通过嵌入函数来实现,用闭包能够简化之。
7、枚举 Enum 语法上多了 case 关键字,反对一系列类型,包含所有的内建数值类型和字符串。在 swift 中,办法能够和枚举关联,即在枚举中增加办法。
在 swift 中,枚举是值类型,而值类型的办法不能对 self 进行批改,如果心愿值类型办法能批改 self,须要标记这个办法为 mutating。
Swift 的枚举,除了像其它语言那样定义一些动态的成员值来枚举可能的状态,还提供了一种弱小的个性,能够定义带关联值的成员。关联值能让你把数据附在枚举实例上,不同的成员能够有不同类型的关联值。
在枚举中,如果带有递归关联值成员,须要关键字 indirect,否则报错。
枚举语法:
enumname.enumvalue. 或者 .enumvalue
8、创立我的项目中,入口文件 main.swift 没有 main 游戏函数
在 main.swift 创立其它文件的构造或类,不须要 import 对应文件
9、构造体 Struct 也是能够申明本人的办法,然而若办法要批改构造体的属性,须要用关键字 mutating 标记,因为构造体和枚举都是值类型。
10、类与构造体的区别之一,反对继承,在重载父类办法的时候要增加 override 关键字
Swift 的类有个新个性,能够禁止子类重载某个函数,在该函数减少 final 关键字。如果咱们在申明一个类时,在 class 前加上 final 修饰符,则示意禁止类被继承。
11、构造体和类都反对类办法(c++ 的静态方法),然而构造体须要在办法前用 static 标记,而类则用 class 标记该办法。用 class 标记的类办法能够由子类重载,想要子类不能重载,则须要用 static 标记。也就是类和构造体都反对 static 关键字标记类办法,但该办法不反对重载。当然也能够用 final class 来标记类办法。
12、属性分存储属性和计算属性。
存储属性用来存储数据,能够是只读属性,也能够是读写属性,只读属性用 let 申明。
swift 减少一个惰性存储属性概念,用 lazy 关键字润饰,惰性贮存属性的值只在第一次拜访的时候才会呈现,因为它依赖类型的内部因素,必须要满足某些前提条件能力计算失去。留神,标记为 lazy 的属性只会被计算一次。
只读的计算属性用 var 来定义,与只读得存储属性不同。计算属性的类型必须显式申明
针对 objc 的 kvo,swift 提供一种个性——属性察看,但计算属性不能用。
13、与类办法相似,有类属性,用 class 标记的属性子类能够重载自定义,用 static 标记的子类不能够重载批改。枚举,构造体和类都反对类属性。
类计算属性与类办法很相似,区别是一个用关键字 var,另一个用 func,类计算属性没有圆括号。
计算属性如果没有写入办法,能够省略定义中的 get。
子类要重载类计算属性,同样要标记 override。
14、swift 提供了 open、public、internal、fileprivate、private 五层访问控制。objc 没有这些拜访限度。
private: 拜访级别所润饰的属性或者办法只能在以后类里拜访.(留神:Swift4 中,extension 里也能够拜访 private 的属性。)
fileprivate: 拜访级别所润饰的属性或者办法在以后的 Swift 源文件里能够拜访。
internal 拜访级别所润饰的属性或办法在源代码所在的整个模块都能够拜访。如果是框架或者库代码,则在整个框架外部都能够拜访,框架由内部代码所援用时,则不能够拜访。如果是 App 代码,也是在整个 App 代码,也是在整个 App 外部能够拜访。
public: 能够被任何人拜访。但其余 module 中不能够被 override 和继承,而在 module 内能够被 override 和继承。
open: 能够被任何人应用,包含 override 和继承。
15、swift 中的初始化办法意义和 c ++ 的构造函数相似。与一般办法相似,然而没有 func 关键字标记,也没有返回值,用 init 关键字做办法名,参数个数可变。
构造体提供了一种默认的初始化办法,会将所有属性都作为参数。与构造体不同,类没有默认的成员初始化办法。
在办法实现中,属性如果遇到同名参数才须要指定 self,不然则不须要。
在初始化办法中容许给常量赋值,其它办法则不容许。
16、初始化减少了两个概念:指定初始化和便捷初始化,便捷初始化须要在 init 前加上关键字 convenience。还有一个 required 关键字不能疏忽,示意子类必须重载该指定初始化办法,只是不必 override 关键字,而是用 required 关键字。便捷初始化参数能够灵便不需蕴含所有属性,且外部必须要调用到一个指定初始化办法。
在创立 Swift 对象,能够相似:var obj = classname.init(), 也能够相似:var obj = classname(), 括号里的参数与 init 实现统一。
17、反初始化就是 c ++ 中的析构函数思维,也相当于 objc 的 www.sangpi.comdealloc,在实例被革除出内存钱会调用到。
18、初始化还有个概念可失败初始化,其实就是可空实例关联的货色,其语法须要再 init 后追随一个问号,也能够追随一个感叹号。感叹号示意返回隐式开展可空类型实例,其应用起来不便(不须要写可空类型开展的语法),但不如追随问号平安。
19、在被赋给另一个实例或是作为参数传递给函数时,值类型总是被复制。
String,Int, Array, Dictionary 等是 Struct,是值类型。
Class 是援用类型。
申明为常量的值类型不能扭转属性,即便属性在类型实现中是用 var 申明也一样。然而申明为常量的援用类型实例的属性却能够被批改。
倡议不要在值类型内应用援用类型,的确须要再构造体内应用援用类型,最好应用不可变的实例。
咱们预期,当把值类型实例赋给新变量、常量或传递给函数时,实例会被复制。然而,若值类型内有援用类型,正本实例和原来实例中援用类型实例还是指向同一个实例,扭转这个援用实例,正本实例中的援用实例也会被影响。
值类型内的援用类型属性在复制时只是浅拷贝,并不会创立新的实例,而是指向同一个实例。
20、了解相等与同一的概念,相等通常是指俩实例的内容相等,同一是指俩实例指向内存中同一个实例。根本数据类型 String、Int、Double、Float、Array、Dictionary 都能够查看相等性。新增语法 === 来检测俩实例的同一性,但值类型不能用同一性查看。类实例若要判断相等性 ==,则须要实现协定 Equatable。
21、对于值类型的复制行为,swift 语言提供了一种写时复制的个性。在某个实例须要批改或写入存储时,该实例才会产生一份本人的正本,在这之前,它们会保护本人对同一份存储的援用。
因而咱们在赋值或将实例作为参数传递时,在它们没被批改或写入存储时,它们还是对同一份存储进行援用。这样值类型就能够防止创立多余的数据正本。