Swift学习笔记-008 多态(疯狂swift讲义第二版)

1.多态的概念

指编译时和运行时的类型不一致,通常表现为声明时是父类,构造时是子类,导致多台的发生,如:
var parent :Parent=Son()
产生多态

2.多态性
class Base{
    func base(){
        print("父类的普通方法")
    }
    func test(){
        print("父类被覆盖的方法")
    }
}

class  Subclass: Base {
    override func test() {
        print("子类覆盖父类的方法")
    }
    func sub(){
        print("子类的普通方法")
    }

}

let bc:Base = Base()
bc.base()
bc.test()

let sc:Subclass=Subclass()
sc.test()
sc.base()
//以上均不存在多态的问题
let ploymo:Base = Subclass()//声明为父类,构造用子类构造,产生多态
ploymo.base()
ploymo.test()
//ploymo.sub()子类构造但ploymo是编译时申明,只有父类方法,没有子类方法即不存在sub()方法

打印结果
父类的普通方法
父类被覆盖的方法
子类覆盖父类的方法
父类的普通方法
父类的普通方法
子类覆盖父类的方法

3.使用is运算符检查类型
class Parent{
    init(name:String,age:Double) {
        self.name=name
        self.age=age
    }
    var name:String
    var age:Double
}

class Son:Parent{
    
    var grade:Int
    init(name:String,age:Double,grade:Int){
        self.grade=grade

        super.init(name: name, age: age)

    }
    
}

var s1=Son(name:"zhangsan", age:23,grade:23)
var p1=Parent(name: "lisi", age: 34)
print(s1 is Son)
print(p1 is Parent)

打印结果
true
true

4.使用as运算符向下转型

从上例

var s2:Son = p1 as! Son

可以编译,但在运行时报一个thread错误
Could not cast value of type ‘MyEX011.Parent’ (0x100585a38) to ‘MyEX011.Son’ (0x100585b08).

5.Any类型及AnyObject类型
class Parent{
    init(name:String,age:Double) {
        self.name=name
        self.age=age
    }
    var name:String
    var age:Double
}

class Son:Parent{
    
    var grade:Int
    init(name:String,age:Double,grade:Int){
        self.grade=grade

        super.init(name: name, age: age)

    }
    
}

var s1=Son(name:"zhangsan", age:23,grade:23)
var p1=Parent(name: "lisi", age: 34)

var  myvalue:Any
myvalue="hello"
print(myvalue)

var myarray:[Any]=[p1,s1]
for element in myarray {
    
    if let f = element as? Parent{
        print(f.name)

    }
}
var myarray2:[AnyObject]=[p1,s1]
for element in myarray2 {
    
    if let f = element as? Parent{
        print(f.name)
        
    }
}

打印结果

6.嵌套类型(类似java的内部类)

swift的枚举、结构体、类的内部都可以定义嵌套类型,被嵌套的类型也可以是枚举、结构体和类,也支持多级嵌套

class User{
    var holidays:[Weekday]
    var location:Point
    init(holidays:[Weekday],location:Point){
        self.holidays=holidays
        self.location=location
    }
    
    struct Point {
        var latitude:Double
        var longtitude:Double
        var posittion:Orientation
        enum Orientation{
            case up,left,Botton,Right
        }
    }
    enum Weekday {
        case Monday,Tuesday,Sunday
        struct Duration{
            var num:Double
            var unit:String
        }
    }
}
7.类扩展

为现有类添加新的方法,并且不需要创建子类,不需要访问原有类的源代码
扩展类可以扩展添加:
存储属性
实例计算属性和类计算属性
添加实例方法和类型方法
添加新的构造器,新构造器不影响原有构造器
添加下标
定义和使用性的嵌套类型
是一个已有类型符合一个或多个协议(接口)
格式:
[修饰符] extension 已有类型{
//添加新功能
}

添加遵守新协议
[修饰符] extension 已有类型:协议1,协议2…{
//实现新协议的功能
}

8.扩展属性(类存储属性,实例计算属性,类计算属性)、方法、构造器及嵌套类型
class User{
    var name:String
    var age:Int
    var _gender:String
    var _home:String
    init(name:String,age:Int,_gender:String,_home:String) {
        self.name=name
        self.age=age
        self._gender=_gender
        self._home=_home
    }
    var gender:String{
        get{
            return _gender
        }
        set{
            self._gender=newValue
        }
    }
    var _major:String?
   
    
}

extension User{
    static var course:[String:Any]=[:]//字典类型
    var home:String{
        get{
            return _home
        }
        set {
            _home=newValue
        }
        
    }
    var major:String?{
        get{
            if _major==nil {
                return nil
            }else{
                return _major
            }
        }
        set{
            _major=newValue
        }
    }
    func study(book:String,building:String)->String{
        print("we are read \(book) in \(building) ")
        return "good study"
    }
    
    class myexten{
        static func say(){
            print("let me tell you")
        }
        
        func dowork(work:String) -> String {
            print("let's do what i want to do")
            return ""
        }
    }
 
}

struct Mystruct {
    var name:String
    var age:Int
    init(name:String,age:Int){
        self.name=name
        self.age=age
    }
}

extension Mystruct{
    init(name:String){
        self.name="taiji"
        self.age=0
    }
}

var  u1 = User(name: "张三", age: 23,_gender:"female",_home:"beijing")
print(u1.gender)
u1.gender="man"
print("the person \(u1.name)--\(u1.age)--\(u1.gender)")
print(u1.home)
u1.home="jiangxi"
print(u1.home)

print("+++++++++++++++++++++")
print(u1.major)
u1.major="chinese"
print(u1.major!)
User.course=["country":"china","age":25]
print(User.course["country"]!)
u1.study(book: "android development", building: "main building")
print(u1.study(book: "", building: ""))

print("+++++++++++++++++++++")
var s1:Mystruct=Mystruct(name: "zhangsanfeng")
print("name is \(s1.name) and age is \(s1.age)")
s1.age=200;
print("name is \(s1.name) and age is \(s1.age)")

print("+++++++++++++++++++++")
User.myexten.say()

var ex=User.myexten()
ex.dowork(work: "hello moto")

打印结果
female
the person 张三–23–man
beijing
jiangxi
+++++++++++++++++++++
nil
chinese
china
we are read android development in main building
we are read in
good study
+++++++++++++++++++++
name is taiji and age is 0
name is taiji and age is 200
+++++++++++++++++++++
let me tell you
let’s do what i want to do

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值