这是我的代码:

class Student {
    var name: String?
    init (name: String) {
        self.name = name
    }
}

class MasterStudent: Student {
    var degree: String?
    init(name: String, degree: String) {
        self.degree = degree
        super.init(name: name, degree: degree)
    }
}

fun updateStudent(stu: Student) {
    var count = 0
    for st in studentArray {
        if (st.id == stu.id) {
            studentArray.removeAtIndex(count)
            st as! MasterStudent     //thread 1 signal :SIGABRT
            studentArray.append(stu)
        }
        count += 1
    }
}

如果传递函数updateStudentaStudent对象,则转换为MasterStudent将导致崩溃。我想把Student对象变成MasterStudent对象。
谢谢

最佳答案

代码无法按原样编译,所以我做了一些小的调整,并在ibm swift沙箱中将其更新为swift 3。
我还添加了一些示例代码,演示当实例化一个MasterStudent对象时,代码不会失败,该对象先向上转换为Student然后向下转换为MasterStudent。但是,当Student对象向下转换为MasterStudent时,实例化该对象将失败。它的类型不对。这样想,我简化了一点——一个Student实例缺少匹配degree行为所需的MasterStudent属性。
as!运算符只应在确定下传将成功时使用。这里有一个这样的例子:

let obj:Any = "Hello World"
let obj2 = obj as! String

当使用as!运算符时,编译器相信您的判断,不会提供编译时错误。如果向下转换不成功,您的用户将收到运行时异常,这通常是要避免的。as?运算符是一个更安全的选择,因为如果不成功,它将向下转换或返回nil

07-27 19:03