swift 从超类到子类的沮丧问题

swift downcast issue from superclass to subclass

这是我的代码:

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
    }
}

如果我向函数 updateStudent 传递一个 Student 对象,转换为 MasterStudent 会导致崩溃。我想将 Student 对象变成 MasterStudent 对象。

感谢

如果 st 对象已经是 MasterStudent 的实例,您只能将 st 向下转换为 MasterStudent。否则你需要创建一个新的 MasterStudent 对象:

MasterStudent(name: st.name, degree: "...")

代码无法按原样编译,所以我做了一些小调整并将其更新为 IBM Swift Sandbox here.[=24 中的 Swift 3 =]

我还添加了一些示例代码,演示代码在实例化向上转换为 Student 然后向下转换为 MasterStudentMasterStudent 对象时不会失败。然而,实例化一个 Student 对象会在向下转换为 MasterStudent 时失败。它不是正确的类型。这样想,我稍微简化了一点——Student 实例缺少匹配 MasterStudent 行为所需的 degree 属性。

as! 运算符只应在确定向下转换会成功时使用。这是一个这样的例子:

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

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