美文网首页swift
iOS开发 - 「Swift 学习」Swift类型转换

iOS开发 - 「Swift 学习」Swift类型转换

作者: 俺不是大佬儿 | 来源:发表于2022-03-17 15:20 被阅读0次

Swift类型转换

类型转换可以判断实例的类型,也可以用于检测实例类型是否属于父类或子类的实例
类型转换用as操作符,检测值的类型用is
类型转换还可以用来检查一个类是否实现了某个协议
例:

    class Subjects {
        var physics:String
        init(physice:String){
            self.physics = physice
        }
    }

    class Chemistry:Subjects {
        var equations:String
        init(physics:String,equations:String) {
            self.equations = equations
            super.init(physice: physics)
        }
    }
    
    class Maths:Subjects{
        var formulae:String
        init(physics:String,formulae:String){
            self.formulae = formulae
            super.init(physice: physics)
        }
    }

类型检测、类型转换

is来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操作符返回 true,否则返回false

类型转换操作符(as?as!)

当不确定向下转型可以成功时,用类型转换的条件形式(as?)。条件形式的类型转换总是返回一个可选值(optional value),并且若下转是不可能的,可选值将是 nil。

只有可以确定向下转型一定会成功时,才使用强制形式(as!)。当你试图向下转型为一个不正确的类型时,强制形式的类型转换会触发一个运行时错误

    let exampleArr = [Maths(physics: "微分方程", formulae: "余弦级数"),
                      Chemistry(physics: "固体物理", equations: "赫兹"),
                      Maths(physics: "天体物理学", formulae: "光年"),
                      Chemistry(physics: "热物理学", equations: "分贝"),
                      Maths(physics: "高等数学", formulae: "微积分")]
    //计数
    var chemCount = 0
    var mathsCount = 0
    
    func exampleFunc(){
        for item in exampleArr {
            //Chemistry类型检查
            if item is Chemistry {
                chemCount += 1
            //Maths类型检查
            }else if item is Maths {
                mathsCount += 1
            }
        }
        print("化学科目包含 \(chemCount) 个主题,数学包含 \(mathsCount) 个主题")

        for item in exampleArr {
            //类型转换的条件形式(as?)
            if let conditionsItem = item as? Chemistry {
                print("物理主题是:\(conditionsItem.physics),\(conditionsItem.equations)")
            }else if let forceItem = item as? Maths {
                print("数学主题是:\(forceItem.physics),\(forceItem.formulae)")
            }
        }
}

调用结果

化学科目包含 2 个主题,数学包含 3 个主题
数学主题是:微分方程,余弦级数
物理主题是:固体物理,赫兹
数学主题是:天体物理学,光年
物理主题是:热物理学,分贝
数学主题是:高等数学,微积分

Any类型转换

Swift中为不确定类型提供了两种特殊的类型别名:
Any可以表示任何类型,包括方法类型(function types)
AnyObject可以代表任何class类型的实例

只有当明确的需要它的行为和功能时才使用Any和AnyObject。在代码里使用期望的明确的类型总是更好的。

 //可以存储Any类型的数组
    var anyExampleArr:[Any] = [Maths(physics: "微分方程", formulae: "余弦级数"),
                               Chemistry(physics: "固体物理", equations: "赫兹"),
                               10000,
                               Maths(physics: "天体物理学", formulae: "光年"),
                               Chemistry(physics: "热物理学", equations: "分贝"),
                               Maths(physics: "高等数学", formulae: "微积分"),
                               3.1415,
                               "hello word"]
    
    func anyTypeFunc(){
        
        for item in anyExampleArr {
            switch item {
        
            case let itemInt as Int:
                print("整型值\(itemInt)")
            case let itemDouble as Double:
                print("浮点型值\(itemDouble)")
            case let itemMaths as Maths:
                print("Maths类型\(itemMaths.physics)")
            case let itemChemistry as Chemistry:
                print("Chemistry类型\(itemChemistry.physics)")
            default:
                print("none")
            }
        }
    }

调用结果

Maths类型 微分方程
Chemistry类型 固体物理
整型值 10000
Maths类型 天体物理学
Chemistry类型 热物理学
Maths类型 高等数学
浮点型值 3.1415
none

\color{gray}{在一个switch语句的case中使用强制形式的类型转换操作符(as, 而不是 as?)来检查和转换到一个明确的类型。}

AnyObject类型转换

//AnyObject
    let anyObjectArr:[AnyObject] = [Maths(physics: "微分方程", formulae: "余弦级数"),
                                    Chemistry(physics: "固体物理", equations: "赫兹"),
                                    Maths(physics: "天体物理学", formulae: "光年"),
                                    Chemistry(physics: "热物理学", equations: "分贝"),
                                    Maths(physics: "高等数学", formulae: "微积分")]
    
    func anyObjectTypeFunc(){
        for itema in anyObjectArr{
            if let someItem = itema as? Maths{
                print("Maths类型\(someItem.physics)")
            }else if let chemistryItem = itema as? Chemistry {
                print("Chemistry类型\(chemistryItem.physics)")
            }else {
                print("其他\(itema)")
            }
        }
    }

调用结果

Maths类型 微分方程
Chemistry类型 固体物理
Maths类型 天体物理学
Chemistry类型 热物理学
Maths类型 高等数学

\color{gray}{欢迎大佬儿来指正纠错,共同学习😏!!}

相关文章

网友评论

    本文标题:iOS开发 - 「Swift 学习」Swift类型转换

    本文链接:https://www.haomeiwen.com/subject/wvrpdrtx.html