一起连带前面几篇Playground小结代码都转到github上了,注释写了很多,主要方便自己以后可以翻翻看。Swift语法主要部分差不多就这些了。当然还有泛型、运算符重载、ARC、闭包之类的补充。
一、扩展(extension)
扩展 extension (类似OC中的分类, 但Swift中没有名字), 即在没有权限获取到原始代码的情况下, 为类增加新功能.
注意: 只要定义了扩展, 那么该扩展对该类的实例都是可用的.
1.1扩展属性(只能是计算属性)
-
- extension Double{
- var km : Double { return self * 1_000.0 }
- var m : Double { return self }
- var cm : Double { return self / 100.0 }
- }
-
- let jjLength = 1.m
- let jjLength_km = 1.km
- println(10.km + 1.m)
1.2扩展构造器
-
- class MyClass{
- var a : Int
- init(){
- a = 10
- }
- }
-
- extension MyClass{
- convenience init(var parm:Int){
- self.init()
- println("扩展构造器--->便利构造器, \(parm)")
- }
- }
-
- var myClass = MyClass(parm: 9)
1.3扩展方法
下面是像Int中扩展myIntFunc方法
- extension Int{
- func myIntFunc(){
- println("值为\(self) , 哈哈哈哈!")
- }
- }
-
- 1.myIntFunc()
1.3.1 修改实例方法
通过扩展方法, 可以修改该实例self本身.但是方法前要加 mutating
- extension Double{
- mutating func myMoidfySelfValue{
- self = self * self
- }
- }
-
- var d = 2.0
- d.myMoidfySelfValue()
1.4 扩展嵌套类型
即向已有的嵌套类型中添加新的嵌套类型. 还可以扩展下标(附属脚本)等.
- extension Character {
- enum Kind{
- case Big
- case Small
- }
- var k : Kind{
- if(String(self).lowercaseString == "a"){
- return Kind.Big
- }else{
- return Kind.Small
- }
- }
- }
- var ch : Character = "a"
- ch.k
二、协议(protocol)
可定义方法与属性, 由具体的类去实现. 越来越像Java
Swift中的协议能被类, 枚举,结构体实现.
- protocol SomeProtocol{
-
- }
-
- class SomeClass : SomeProtocol{
-
- }
2.1 协议中属性/方法/突变方法的要求
2.1.1 属性的要求
- protocol AnotherProtocol1{
-
- class var property : Int { get set}
- }
-
- class AnotherClass1 : AnotherProtocol1{
- class var property : Int {
- get{
- return 10
- }
- set{
-
- }
- }
- }
2.1.2 方法要求
-
- protocol AnotherProtocol2{
- func myFunc() -> Int
- }
-
- class AnotherClass2 : AnotherProtocol2{
- func myFunc() -> Int {
- return 10
- }
- }
2.1.3 突变方法要求
能在方法或函数内部改变实例类型的方法称为突变方法. (mutating关键字)
在类中,可以不写mutating, 但在结构体与枚举中国必须写
- protocol Togg{
- mutating func togg()
- }
-
- enum OnOffSwitch : Togg{
- case Off , On
-
- mutating func togg() {
- switch self{
- case .Off:
- self = On
- case .On:
- self = Off
- }
- }
- }
-
- var lightSwitch = OnOffSwitch.Off
- lightSwitch.togg()
2.2 协议类型.
协议也可以当做类型来使用. 这点和函数一样.
1.可作为参数/返回值类型
2.可作为常量/变量/属性的类型
3.可作为数组/字典和其他元素类型
- protocol MyRect{
- func myLuckNumber() -> Int
- }
-
- class MyRectImp : MyRect{
- func myLuckNumber() -> Int {
- return 10
- }
- }
-
- class Dice {
- let sides :Int
- var gener : MyRect
- init(sides:Int, gener:MyRect){
- self.sides = sides
- self.gener = gener
- }
- }
-
- var dice = Dice(sides: 6, gener: MyRectImp())
- dice.gener.myLuckNumber()