这是我的代码:
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
aStudent
对象,则转换为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
。