最近在IMOOK(网站)上自学了下swift , 总结下swift相对其余语言的不一样之处 , 方便熟悉其余语言的程序员,熟悉swift语言的特性.java
1. swift 的特别之处就是能够在原有的类上 , 使用 protocol (相似java接口) 得到泛型的做用 . ios
2. 经过extension能够扩展普通的class, struct, 也能够扩展protocol, 使用protocol类都拥有公共的扩展.程序员
1 protocol Readable { 2 3 var programLang:String 4 5 var programeSourceUrl:String 6 7 var maxExecuteSecounds:Long 8 9 } 10 11 protocol Execuable { 12 func execute() 13 } 14 15 16 17 class BrowserScript : Readable { 18 19 var progameLang:String = "js" 20 var programeSourceUrl:String = "http://xxxx.com/adfd.js" 21 var maxExecuteSecounds:Long=20
23 init() { 24 println("browser script init") 25 } 26 27 28 execute 29 30 } 31 32 extenstion BrowserScript:Executable { 33 execute() { 34 JavaCoreScript.run(programeSourceUrl); 35 } 36 } 37 38 39 //test: 40 41 func executeTask<T:Executable>(executor:T) { 42 executor.execute(); 43 } 44 45 46 executeTask(BrowserScript()); //不会报错 47 48 49
经过协议再不修改BrowserScript类定义文件的前提下, 为BrowserScript增长了execute的能力.
extenstion 能够用在ios内置,各类库,本身编写的任意类,函数体,Enum,由于基本数据类型实际是结构体,因此也能够extension功能.swift
在swift官方的实现中大量使用extension实现功能,swift是面向协议扩展的语言.闭包
3. swift的问号函数
swift 问号相似 var card:String? ,有问号表示这个变量能够为空(nil),实际也是Optional枚举类型,有值时候用Optional.Some()包装,使用时候须要解包,若是为nil实际为Optional.None().网站
解包的方法就是spa
if let card = card { println("your card is ",card); }
4. Int,Long,String,Dictionary,Array 其实都是结构体,struct.code
结构体和类的区别就是,结构体传值都是内存拷贝, 类引用通常都是引用.对象
5. weak 关键字.
weak 关键字表示弱引用, 就是拥有这个weak变量的对象不持有这个变量的引用.引用计数是内存回收的一种方法,为0时系统负责回收内存,若是对象A包含属性B强引用属性,直接a=nil, B 不会回收. 若是属性B设置为弱引用,自己设置属性b, b的引用计数不增加. weak用在此属性能够为空的状况.
6.unowned 关键字.
unowned 至关于weak,不过这个属性不能为空.属性被设置为空,程序崩溃直接退出.因此不多用.
7. 函数/方法.
7.1 方法定义:
func method1(_ x1:Int,_ x2 :Int) ->Int { //do something }
var sum = method1(1,2);
上面的参数中的下划线是外参数名 ,位置在形参x1前面 ,若是是下划线,表示调用时候不用写外参名称.若是是有名字,调用时候须要写外参数名,加入第二个参数的下划线替换成num2,调用时须要写成:
var sum2 = method1(1,num2:2);
最后的->表示以后跟着的是返回值 ,返回值能够是一个值,也能够是函数(方法).
方法能够直接写闭包(匿名函数) .
举例: 学生报名到学校, 返回流程处理函数, 具体就是执行了发送短信叫家长交学费. 返回的函数参数是家长的相关联系方式.
func add(student:Student,to school:School) ->(String)->{sendMsgToParentsFee($0);}
上面的返回值是最后那个参数是String类型,具体执行是{}包含着的函数.里面的$0 表示参数中的第一个参数,多个参数依次累加表示.
调用 :
x.add(student:studentObj,to:schoolObj)