ios – 在斯威夫特打字

我正在编写一个可以从 JSON中解析类型的ID的库.但是,我发现类似的规则有点令人困惑.

例:

class AccountId : Nsstring { }

let json : AnyObject? = "user-1" // Returned by NSJSONSerialization.JSONObjectWithData
let s = json as? Nsstring   // Succeeds,s == Some("user-1")
let a = json as? AccountId  // Fails,a == nil

为什么第一个typecast成功,而第二个失败? Nsstring有没有什么神奇的东西,它不会交叉到swift-class

我正在使用XCode版本6.1(6A1030)(写作时的最新版本).

解决方法

作为一般规则,如果您有层次结构的类A – > B – > C(C继承自B,而A继承自A),并且你有一个B的实例,你可以上传到A,但是你不能down to C.

原因是C可能添加在B中不可用的属性,因此编译器或运行时将不知道如何初始化附加数据,更不要说它也必须分配.

请注意,多态使您可以使用变量进行upcast和downcast – 这意味着,如果您将C的实例存储在A类变量中,则可以将该变量转换为B和C,因为它实际上包含一个C.但是,如果变量包含B的实例,则可以向B进行倒转,但不能为C.

在你的情况下,而不是downcasting你应该专门的接受Nsstring的构造函数,但我怀疑在Nsstring的这种特殊情况下,它不能完成(没有Nsstring指定的初始化程序接受一个字符串作为参数).如果你能够做到这一点,你的代码将会如下所示:

var json: AnyObject? = "test"
if let string = json as? Nsstring {
    let a = AccountId(string: string)
}

在这一点上,您可以使用一个实例的AccountId或Nsstring的预期

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...