swift -- as / 扩展

一、使用 可选链式 调用代替强制展开

//当声明一个属性时,将属性类型设置为可选类型: 好处: 当可选类型的属性被赋予初始值时,系统调用初始值;当可选类型属性没有赋予初始值时,系统只会调用失败;如果属性强制展开,就会崩溃

// 如果属性为一般类型,则必须赋予初始值

struct Point {

    var width : Int = 0

}

 

 class Person {

    var name : String = ""

    var age : Int?       //可选类型, 可以不赋值

    var po : Point? = Point.init()   //赋值

}

//调用

var person = Person.init()

person.name = "adsf"

print(person.name)

 print(person.age)

//print(person.po!.width)   //展开,只有赋有初始值,展开才不会报错

 person.po?.width = 1000

二、类型匹配

1.检查类型  is

var array = [1,2,"10","88",90,100]

var strNum = 0

var intNum = 0

for i in array {

    if i is Int{

        intNum += 1

    }

    if i is String {

        strNum += 1

    }

}

 print(strNum,intNum)    //  2  4 

 2.向下转型  as? 或 as!

//NSMutableArray > NSArray > Array 

//可变类型-->不可变-->swift

var arr = NSMutableArray.init(capacity: 0)

arr.addObject(1)

arr.addObject(2)

let arr2 = arr as NSArray

let arr3 = arr2 as Array     //最终arr3 变成swift中的数组类型

 print(arr3)      

 

3.Any 和 AnyObject :

//a.AnyObject 可以表示任何类类型的 实例

//b.Any 可以表示任何类型,包括函数类型。

var array6 : [AnyObject] = [1,2,3,4,"io"]

 print(array6)

 

三、扩展

//1.扩展语法

extension Int {

    //2.属性扩展 (一定有返回值的)

    var a : Int {

        return self * 10

    }

     //3.方法扩展

    func age() -> Void{

        print("age")

    }

 

}

 //使用拓展

var ss : Int = 5

print(ss)

print(ss.a)

 

ss.age()

 

4.如果给父类扩展,则子类同样可以获取到

例:

class Student{

    var name = ""

}

class Xiao: Student {

    var age = 2

}

 

//扩展父类

extension Student {

    func eat() -> Void{

        print("eat")

    }

}

 //调用

var stu = Student.init()

stu.eat()

var xiao = Xiao.init()

xiao.eat()  //子类可以调用父类的 拓展的方法

 

posted @ 2016-06-14 19:45  Da雪山  阅读(150)  评论(0编辑  收藏  举报