分享

Swift学习之路九(扩展) | LvesLi's Blogging

 爽行天下丶 2015-06-19

写在前面

喜欢我们的内容,可以订阅我们的官方微信公众账号:乐Coding。

版权属于: LvesLi’s Blogging

原文地址:

转载时必须以链接形式注明原始出处及本声明。

扩展就是向一个已有的类、结构体或枚举类型添加新功能(functionality)。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模)。扩展和 Objective-C 中的分类(categories)类似。(不过与Objective-C不同的是,Swift 的扩展没有名字。)

Swift 中的扩展可以:

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

2) 定义实例方法和类型方法

3) 提供新的构造器

4) 定义下标

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

6) 使一个已有类型符合某个协议

注意:
如果你定义了一个扩展向一个已有类型添加新功能,那么这个新功能对该类型的所有已有实例中都是可用的,即使它们是在你的这个扩展的前面定义的。

1.语法
声明一个扩展使用关键字extension:

extension SomeType: SomeProtocol, AnotherProctocol {
// 协议实现写到这里
}

2. 计算型属性(Computed Properties)

extension Float{
//添加一个计算型实例属性
var add10:Float{return self+10}
}
var f:Float=10
f.add10 //20

注意:
扩展可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器(property observers)。

2.构造器(Initializers)

扩展能向类中添加新的便利构造器,但是它们不能向类中添加新的指定构造器或析构函数。指定构造器和析构函数必须总是由原始的类实现来提供。


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()
}
//我们可以这样创建实例
let aRect=Rect()
let anotherRect=Rect(origin: Point(x: 10, y: 10), size: Size(width: 10, height: 10))
//扩展Rect结构体:
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)
}
}
let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
size: Size(width: 3.0, height: 3.0))

3.方法(Methods)

class Person {
var name:String
init(name:String){
self.name=name
}
}
//创建实例
let lves=Person(name: "lves")
extension Person{
func sayHi(){
print("Hello, I am \(self.name)")
}
}
lves.sayHi()

打印:Hello, I am lves
4. 下标(Subscripts)
扩展可以向一个已有类型添加新下标。这个例子向Swift内建类型Int添加了一个整型下标。该下标[n]返回十进制数字从右向左数的第n个数字


extension Int {
subscript(var digitIndex: Int) -> Int {
var decimalBase = 1
while digitIndex > 0 {
decimalBase *= 10
--digitIndex
}
return (self / decimalBase) % 10
}
}
746381295[0]
// returns 5
746381295[1]
// returns 9
746381295[2]
// returns 2
746381295[8]
// returns 7

5. 嵌套类型(Nested Types)

下面给Person嵌套一个枚举类型


extension Person{
//定义国家
enum Country{
case China,USA,UK
}
var country:Country{
switch self.name{
case "lves":
return .China
case "Jake":
return .USA
default:
return .China
}
}
}
lves.country.hashValue // 0

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多