
回复
在分布式设备开发中,类型转换就像不同语言的翻译官。曾因强制转换导致车载系统崩溃,后来总结出这套安全转换体系,现在分享给大家避坑。
目标类型(值)
is
:判断类型(返回Bool)as?
:安全转换(失败返回None)as!
:强制转换(失败崩溃)open class Animal {}
class Dog <: Animal {}
let pet: Animal = Dog()
if pet is Dog {
let dog = pet as? Dog // 安全转换
dog.bark()
}
interface Flyable {}
class Bird <: Flyable {}
let bird: Bird = Bird()
let flyable: Flyable = bird // 合法,接口转型
let backToBird = flyable as? Bird // 成功转换
泛型容器丢失具体类型信息:
let list: Array<Any> = [Dog()]
let dog = list[0] as? Dog // 成功
let cat = list[0] as? Cat // 失败,返回None
反例(危险):
let obj: Any = "text"
let num = obj as! Int // 运行时崩溃
正例(安全):
if let str = obj as? String {
processString(str)
}
interface DeviceData {
func toJSON(): String
}
class DeviceAData <: DeviceData {
private let value: Int
public func toJSON() -> String {
"{\"value\": \(value)}"
}
}
func processData(data: Any) {
if let deviceData = data as? DeviceData {
let json = deviceData.toJSON()
sendToCloud(json)
} else {
print("不支持的类型")
}
}
as?
安全转换,避免as!
强制转换