为什么需要使用NSObject?
问题描述:
我很困惑,我应该需要使用NSObject
swift3。如果是的话,请指导我也是它采用最佳实践NSNumber
为什么需要使用NSObject?
class App: NSObject {
var id: NSNumber?
var name: String?
var category: String?
var imageName: String?
var price: NSNumber?
var screenshots: [String]?
var desc: String?
var appInformation: AnyObject?
// override func setValue(_ value: Any?, forKey key: String) {
// if key == "description" {
// self.desc = value as? String
// } else {
// super.setValue(value, forKey: key)
// }
// }
}
注:你能告诉我为什么请需要使用NSObject的?有什么优势?
答
你要覆盖一个超类方法:
override func setValue(_ value: Any?, forKey key: String) { }
所以,如果你的类没有扩展NSObject
类,怎么可能覆盖它的父类的方法?
您无法扩展NSObject
类,但您必须从代码中删除override
关键字,因为setValue
将成为您的自定义类的一种方法。如果你这样做,你显然不能拨打super.setValue(value, forKey: key)
。
答
NSObject类:
该类是根类最Objective-C类层次结构,从该子类继承到运行系统和表现为Objective-C的对象的能力基本接口。 (source)。
AnyObject协议:它隐式确认任何对象。
当需要无类型对象的灵活性时,或者当您使用桥接的Objective-C方法和返回无类型结果的属性时,可以使用AnyObject。 AnyObject可以用作任何类,类类型或类专用协议的实例的具体类型。
AnyObject也可以用作桥接到Objective-C类的类型实例的具体类型。
let s: AnyObject = "This is a bridged string." as NSString
print(s is NSString)
// Prints "true"
let v: AnyObject = 100 as NSNumber
print(type(of: v))
// Prints "__NSCFNumber"
AnyObject协议的灵活行为类似于Objective-C的id类型。因此,导入的Objective-C类型经常使用AnyObject作为属性,方法参数和返回值的类型。 (source)
所以,你可以使用NSNumber
变量作为AnyObject
以后可以类型转换隐含相应。
它必须是'NSObject'来覆盖函数'setValue(_:forKey :)' – Desdenova
@Desdenova更新我的问题!你能告诉我为什么需要使用NSObject吗?有什么优势? –
我不明白你的问题后,你的评论。你不需要使用'NSObject',你甚至不需要一个类。结构也可以容纳这些。 – Desdenova