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
然后向下转换为 MasterStudent
的 MasterStudent
对象时不会失败。然而,实例化一个 Student
对象会在向下转换为 MasterStudent
时失败。它不是正确的类型。这样想,我稍微简化了一点——Student
实例缺少匹配 MasterStudent
行为所需的 degree
属性。
as!
运算符只应在确定向下转换会成功时使用。这是一个这样的例子:
let obj:Any = "Hello World"
let obj2 = obj as! String
使用 as!
运算符时,编译器相信您的判断,不会提供编译时错误。如果向下转型不成功,您的用户将收到 运行 次异常,这通常是要避免的。 as?
运算符是一个更安全的选择,因为如果不成功,它将向下转换或 return nil
。
这是我的代码:
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
然后向下转换为 MasterStudent
的 MasterStudent
对象时不会失败。然而,实例化一个 Student
对象会在向下转换为 MasterStudent
时失败。它不是正确的类型。这样想,我稍微简化了一点——Student
实例缺少匹配 MasterStudent
行为所需的 degree
属性。
as!
运算符只应在确定向下转换会成功时使用。这是一个这样的例子:
let obj:Any = "Hello World"
let obj2 = obj as! String
使用 as!
运算符时,编译器相信您的判断,不会提供编译时错误。如果向下转型不成功,您的用户将收到 运行 次异常,这通常是要避免的。 as?
运算符是一个更安全的选择,因为如果不成功,它将向下转换或 return nil
。