苹果新的编程语言 Swift 语言进阶(十四)--扩展


       扩展是为一个已经存在的类、结构、枚举类型加入新功能的一种方式。包含为不能存取源码的那些已经存在的类型加入功能。

       扩展相似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名字。

       扩展可以为已存在类型:

       1)添加计算属性和计算静态属性。

       2)定义新的实例方法和类型方法。

       3)提供新的初始化方法;

       4)定义新的下标方法;

       5)定义和使用新的嵌套类型。

       6)使其符合某个协议

       使用扩展为已存在类型加入的新功能,对于该类型的全部实例都可用,包含那些在扩展创建之前就已经创建的实例。

       1.1 扩展语法

       使用extensionkeyword来声明一个扩展:

    extensionSomeType {

   // new functionality to add to SomeType goes here

}


   1.2 扩展的使用

    1)、 加入计算属性

     例如以下样例展示了通过扩展Swift语言内建的Double类型,为其加入几个仅仅读的计算实例属性使其具有了长度单位转换功能。

extension Double {

   var km:Double {return self *1_000.0 }

   var m:Double {return self }

   var cm:Double {return self /100.0 }

   var mm:Double {return self /1_000.0 }

   var ft:Double {return self /3.28084 }

}

let oneInch =25.4.mm

println("One inch is\(oneInch) meters")

// prints "One inch is 0.0254 meters"

let threeFeet =3.ft

println("Three feet is\(threeFeet) meters”)

     扩展不能加入存储属性或者为已存在的属性加入属性观察者。

    2)、 加入初始化方法

     扩展能为已有类型添加新的初始化方法。

     扩展能为一个已有类添加新的便利初始化方法。但不能为其添加新的指派初始化方法或析构。

     假设你使用扩展为一个未定义不论什么定制初始化方法的值类型添加一个为它的全部的存储属性提供默认值的初始化方法 ,你能在扩展中定义的这个初始化方法中调用Swift语言为其提供的默认初始化方法或者成员逐一初始化方法。以下的样例使用扩展为一个Rect结构提供了额外的初始化方法:

struct Size {

   var width =0.0,height =0.0

}

struct Point {

   var x =0.0,y =0.0

}

struct Rect {

   var origin =Point()

   var size =Size()

}

 extension Rect {

   init(center:Point,size:Size) {

       let originX =center.x - (size.width / 2)

       let originY =center.y - (size.height / 2)

       self.init(origin:Point(x:originX,y:originY),size:size)

    }

}

     该扩展中定义的初始化方法调用了原结构中已有的由Swift提供的成员逐一初始化方法。

    3)、 方法的加入

      扩展也能为已有类型添加新的实例方法和类型方法。下例为Swift的内嵌类型Int类型添加了一个新的实例方法repetitions。

  extension Int {

   func repetitions(task: () -> ()) {

     task()

      }

 }

     添加的实例方法repetitions方法带有一个没有输入參数和返回值的函数參数,因此你可以在随意一个整数上使用闭合作为參数调用该方法,  例如以下所看到的:

 3.repetitions({

   println("Hello!")

    })

 // Hello!

 因为使用闭合作为方法的參数,因此还可以简化为:

 3.repetitions {

   println("Goodbye!")

 }

 // Goodbye!

     用一个扩展添加的实例方法也可以改动实例自身及其属性。与方法的变异相似。要改动一个结构和枚举的self属性或者改动它的其他属性,扩展的实例方法必须使用mutatingkeyword来标记。

     例如以下的样例用来扩展Swift语言的内嵌整数类型(Int)。该扩展为Int类型添加了一个新的变异方法square。quare内部可以改动self属性(实现求本身数的倍数),因此该方法被标记为mutating。

extension Int {

   mutating fund square() {

       self =self *self

    }

}

var someInt =3

someInt.square()

// someInt is now 9

    4)、下标方法的加入

       扩展也能为已有类型添加新的下标方法,例如以下展示了一个为Swift语言内建的整数类型加入一个下标方法的样例。该样例实现某个整数的下标[] ,下标n[n]返回该整数的从右開始的第n位置,例如以下所看到的:

extension Int {

   subscript(digitIndex:Int) ->Int {

       var decimalBase =1

           for_in 1...digitIndex {

               decimalBase *=10

            }

           return (self /decimalBase) %10

    }

}

746381295[0]

// returns 5

    5)  加入嵌套类型 

       扩展也能为已有类型(类、扩展、枚举)添加新的嵌套类型。例如以下样例所看到的:

       extensionCharacter {

   enum Kind {

       case Vowel,Consonant,Other

    }

   var kind:Kind {

   switch String(self).lowercaseString {

   case "a","e","i","o","u":

       return .Vowel

   case "b","c","d","f","g","h","j","k","l","m",

   "n","p","q","r","s","t","v","w","x","y","z":

       return .Consonant

   default:

       return .Other

        }

    }

}

      本例使用扩展为Swift语言内建的Character类型添加了一个内嵌类型Kind。并使用该类型返回呈现特定字符的字母的类型。


                                                    版权全部,请转载时清楚注明链接和出处,谢谢!


posted @ 2019-05-22 15:57  ldxsuanfa  阅读(233)  评论(0编辑  收藏  举报