每天学一点Swift----面向对象下(五)

来源:互联网 发布:管家婆软件多少钱 编辑:程序博客网 时间:2024/05/23 01:06

.嵌套类型

    1. Swift允许在一个类型的内部定义另一个类型,这种机制被称为嵌套类型。

    

    2. 对比于JavaSwift的嵌套类型就类似于Java中的内部类。

    

    3. Swift的枚举、结构体、类的内部都可以定义嵌套类型,被嵌套的类型也可以是枚举、结构体和类。Swift的嵌套类型支持多级嵌套,即嵌套类型还可以再包含嵌套类型。

    

    4. 需要注意的是:嵌套类型不允许使用staticclass修饰,也就是说,嵌套类型没有所谓的类型相关的嵌套类型。

    

    .扩展

    1. 在项目开发中,有时候需要为已有的类扩展一些新的行为,关于这种扩展行为,最容易想到的就是继承,通过继承可以重写父类已有的方法。但有些时候,使用继承并不是最好的选择,此时就需要借助于扩展来实现了:扩展是Swift的一种动态特征,Swift允许使用扩展为现有的类添加新方法,并且不需要创建子类,不需要访问原有类的源代码。

    

    2. Swift的扩展和Objective-C中扩展并不相同,而是和Objective-C的分类比较相似,只是Swift的扩展没有名字。

    

    3. Swift中的扩展提供如下功能:

    1)添加类型存储属性;(2)添加实例计算属性和类型计算属性;(3)添加实例方法和类型方法;(4)添加新的构造器,而且新添加的构造器不影响原有的;(5)添加下标;(6)定义和使用新的嵌套类型;(7)使一个已有类型符合一个或多个协议。

    

    4. 扩展可以添加新的功能,但扩展并不是派生子类,因此扩展不支持重写。

    

    5. 扩展的定义为:

    [修饰符] extension已有类型

    {

    //添加新功能

    }

    

    6. 通过扩展让已有的类型遵守一个或多个协议的格式为:

    [修饰符] extension已有类型协议1协议2

    {

    //实现协议方法

    }

    

    7.如果程序通过扩展为一个已有类型添加了新功能,那么这个新功能在该类型的所有已有实例中都是可用的,即使它们是在这个扩展之前定义的。

    

    8. 使用扩展添加属性:使用扩展可以添加3种属性————类型存储属性,实例计算属性,类型计算属性。使用扩展不能添加实例存储属性。

    

    9. 举个栗子:

    extension String

    {

    //通过扩展添加类型存储属性

    static var data : [String : Any] = [:]

    //定义一个实例计算属性,并为该属性提供gettersetter部分

    var length : Int{

    get{

    //getter部分

    }

    set

    {

    //setter部分

    }

    }

    }

    

    上面程序中,第一行代码为String结构体增加了一个名为data,类型为[String : Any]的存储属性,这样程序就可以使用String结构体作为全局的数据存储区,用于存放多个key-value对。

第二行代码为String结构体增加了一个length属性,通过gettersetter部分可以实现访问和设置字符串的长度。

10. 使用扩展添加方法:使用扩展既可以添加实例方法,也可以添加类型方法,只是添加类型方法时需要在类型方法前添加staticclass

11. 举个栗子:

extension String

{

//添加一个新的实例方法,用于获取当前字符串中指定范围的子串

func subStringFromStart(start : Int, toEnd : Int) -> String

{...}

//定义一个类方法,该类方法用于将Bool值转换为字符串

static func valueOf(value : Bool) -> String

{

return "\(value)"

}

}

12. 使用扩展添加可变方法:可变方法可以改变值类型的实例本身————类不可以定义可变方法,因此也不能通过扩展为类添加可变方法。举个栗子:

extension Array

{

//定义一个方法,用于计算数组的交集

mutating func retainAll(Array : [T], compartor : (T, T) -> Bool)

{ ... }

}

13. 使用扩展添加类构造器:通过扩展添加的构造器不会影响类型中原有的构造器----如果希望系统提供的默认构造器和程序定义的构造器并存,则需要使用扩展,并在扩展中添加构造器,这样就不会影响系统提供的默认构造器了。


14. 举个栗子:

//定义一个结构体,该结构体不包含任何构造器,系统将为之提供一个默认构造器

struct SomeStruct

{

var name String 

var count : Int

}

//使用扩展来添加构造器

extension SomeStruct

{

//通过扩展添加的2个构造器对该类型原有的构造器没有影响

init(name : String)

{

self.name = name

self.count = 0

}

init(count : Int)

{

self.count = count

self.name  = ""

}

}

15. 使用扩展还可以添加下标和嵌套类型,一旦通过扩展添加了下标和嵌套类型之后,程序就可以像之前的普通类型那样使用它们。


上一篇:每天学一点Swift----面向对象下(四)

下一篇:每天学一点Swift----面向对象下(五)

原创粉丝点击