Swift 语言新特性总结(2)

1、swift的Array类型可以持有任何类型的值——对象和非对象都可以。

2、声明数组主要有两种语法,数组实例也支持类型推断

var bucketList:[String]

var friends:Array<String>

var weeks =["Monday","Tuesday"]  ——字面量语法

var array = Array()

var array =[Int]()

3、声明字典语法,支持类型推断

var dict1:Dictionary =[:]

var dict2 = Dictionary()

var dict3:[String:Double]=[:]

var dict4 =[String:Double]()

var dict5 =[“name”:”shelton”,”age”:]

Swift与obj-c的字典区别,就是简化赋值objc用大括号{},swift用中括号[]

4、集合Set是无序,储存元素唯一,数组有序,储存元素可以重复,字典无序,但键值唯一。

5、Swift函数支持嵌套,用元组语法来支持返回多个值,支持变长参数,支持参数带默认值。函数还允许有外部名与内部名。元组也可以作为函数参数

6、闭包就是objc中的Block

闭包语法:

{(参数)->返回类型 in

//代码

}

闭包可以利用swift的类型推断系统去除参数和返回值的类型信息来简化闭包。

如果闭包代码只有一行表达式,return关键字也可以省略。

闭包甚至可以利用快捷参数名来替代显式声明的参数,做到剔除参数声明来简化闭包。$0表示第一个参数,$1表示第二个参数。

尾部闭包语法甚至可以省略掉方法的圆括号。

闭包和函数能记录在其闭合作用域中定义的变量所封装的内部信息。

闭包是引用类型。

func greeting(_ greeting:String)->(String)->String {

    return {(name:String)-> Stringin

        return "\(greeting)\(name)"

    }

}

上面函数,有一个String参数,结果返回一个函数,不需要通过嵌入函数来实现,用闭包可以简化之。

7、枚举Enum语法上多了case关键字,支持一系列类型,包括所有的内建数值类型和字符串。在swift中,方法可以和枚举关联。

在swift中,枚举是值类型,而值类型的方法不能对self进行修改,如果希望值类型方法能修改self,需要标记这个方法为mutating。

Swift的枚举,除了像其它语言那样定义一些静态的成员值来枚举可能的状态,还提供了一种强大的特性,可以定义带关联值的成员,不同的成员可以有不同类型的关联值。在枚举中,如果带有递归关联值成员,需要关键字indirect,否则报错。

8、创建项目中,入口文件main.swift没有main函数

      在main.swift创建其它文件的结构或类,不需要import对应文件

9、结构体Struct也是可以声明自己的方法,但是若方法要修改结构体的属性,需要用关键字mutating标志,因为结构体和枚举都是值类型。

10、类与结构体的区别之一,支持继承,在重载父类方法的时候要添加override关键字

Swift的类有个新特性,可以禁止子类重载某个函数,在该函数增加final关键字,也可以用这个关键字禁止类被继承。

11、结构体和类都支持类方法,但是结构体需要在方法前用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没有这些访问限制。

15、swift中的初始化方法意义和c++的构造函数类似。与普通方法类似,但是没有func关键字标记,也没有返回值,用init关键字做方法名,参数个数可变。

结构体提供了一种默认的初始化方法,会将所有属性都作为参数。与结构体不同,类没有默认的成员初始化方法。

在方法实现中,属性如果遇到同名参数才需要指定self,不然则不需要。

在初始化方法中允许给常量赋值,其它方法则不允许。

16、初始化增加了两个概念:指定初始化和便捷初始化,便捷初始化需要在init前加上关键字convenience。还有一个required关键字不能忽略,表示子类必须重载该指定初始化方法,只是不用override关键字,而是用required关键字。便捷初始化参数可以灵活不需包含所有属性,且内部必须要调用到一个指定初始化方法。

17、反初始化就是c++中的析构函数思想,也相当于objc的dealloc,在实例被清除出内存钱会调用到。

18、初始化还有个概念可失败初始化,其实就是可空实例关联的东西,其语法需要再init后跟随一个问号,也可以跟随一个感叹号。感叹号表示返回隐式展开可空类型实例,其使用起来方便(不需要写可空类型展开的语法),但不如跟随问号安全。

19、在被赋给另一个实例或是作为参数传递给函数时,值类型总是被复制。

String,Int, Array, Dictionary等是Struct,是值类型。

Class是引用类型。

声明为常量的值类型不能改变属性,即使属性在类型实现中是用var声明也一样。但是声明为常量的引用类型实例的属性却可以被修改。

建议不要在值类型内使用引用类型,确实需要再结构体内使用引用类型,最好使用不可变的实例。

我们预期,当把值类型实例赋给新变量、常量或传递给函数时,实例会被复制。但是,若值类型内有引用类型,副本实例和原来实例中引用类型实例还是指向同一个实例,改变这个引用实例,副本实例中的引用实例也会被影响。

值类型内的引用类型属性在复制时只是浅拷贝,并不会创建新的实例,而是指向同一个实例。

20、理解相等与同一的概念,相等通常是指俩实例的内容相等,同一是指俩实例指向内存中同一个实例。基本数据类型String、Int、Double、Float、Array、Dictionary都可以检查相等性。新增语法===来检测俩实例的同一性,但值类型不能用同一性检查。类实例若要判断相等性==,则需要实现协议Equatable。

21、关于值类型的复制行为,swift语言提供了一种写时复制的特性。在某个实例需要修改或写入存储时,该实例才会产生一份自己的副本,在这之前,它们会维护自己对同一份存储的引用。

因此我们在赋值或将实例作为参数传递时,在它们没被修改或写入存储时,它们还是对同一份存储进行引用。这样值类型就可以避免创建多余的数据副本。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容