swift_026(Swift 的类型转换)

//***********swift学习之26--类型转换--***************************


/*

 检查类型

 类型检查使用 is 关键字。

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

 */



/*

 向下转型

 向下转型,用类型转换操作符(as? as!)

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

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

 */


class Subjects {

    var physics: String

    init(physics: String) {

        self.physics = physics

    }

}


class Chemistry: Subjects {

    var equations: String

    init(physics: String, equations: String) {

        self.equations = equations

        super.init(physics: physics)

    }

}


class Maths: Subjects {

    var formulae: String

    init(physics: String, formulae: String) {

        self.formulae = formulae

        super.init(physics: physics)

    }

}


let sa = [

    Chemistry(physics: "固体物理", equations: "赫兹"),

    Maths(physics: "流体动力学", formulae: "千兆赫"),

    Chemistry(physics: "热物理学", equations: "分贝"),

    Maths(physics: "天体物理学", formulae: "兆赫"),

    Maths(physics: "微分方程", formulae: "余弦级数")]



var chemCount = 0

var mathsCount = 0


for item in sa {

    

    // 检查类型

    if item is Chemistry {

        chemCount += 1

    } else if item is Maths {

        mathsCount += 1

    }

    

    // 向下转型:类型转换的条件形式

    if let show = item as? Chemistry {

        print("化学主题是: '\(show.physics)', \(show.equations)")

        // 强制形式

    } else if let example = item as? Maths {

        print("数学主题是: '\(example.physics)',  \(example.formulae)")

    }

    

}


print("化学科目包含 \(chemCount) 个主题,数学包含 \(mathsCount) 个主题")





// AnyAnyObject的类型转换

// Swift为不确定类型提供了两种特殊类型别名:

// AnyObject可以代表任何class类型的实例。

// Any可以表示任何类型,包括方法类型(function types)。


// aa:可以存储Any类型的数组 exampleany

var exampleany = [Any]()


exampleany.append(12)

exampleany.append(3.14159)

exampleany.append("Any 实例")

exampleany.append(Chemistry(physics: "固体物理", equations: "兆赫"))


for item2 in exampleany {

    switch item2 {

    case let someInt as Int:

        print("整型值为 \(someInt)")

    case let someDouble as Double where someDouble > 0:

        print("Pi 值为 \(someDouble)")

    case let someString as String:

        print("\(someString)")

    case let phy as Chemistry:

        print("主题 '\(phy.physics)', \(phy.equations)")

    default:

        print("None")

    }

}


// 注意:只有当你明确的需要它的行为和功能时才使用AnyAnyObject。在你的代码里使用你期望的明确的类型总是更好的。


// bb:[AnyObject] 类型的数组

let saprint: [AnyObject] = [

    Chemistry(physics: "固体物理", equations: "赫兹"),

    Maths(physics: "流体动力学", formulae: "千兆赫"),

    Chemistry(physics: "热物理学", equations: "分贝"),

    Maths(physics: "天体物理学", formulae: "兆赫"),

    Maths(physics: "微分方程", formulae: "余弦级数")]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值