我很困惑,我应该使用NSObject
来swift3。如果是这样,请指导我也是使用NSNumber
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?有什么好处?
答案 0 :(得分:1)
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
,以后可以隐式地进行类型转换。
答案 1 :(得分:0)
你正在覆盖一个超类方法:
CREATE TABLE students(id INT AUTO_INCREMENT, name VARCHAR(255), PRIMARY KEY id);
那么,如果你的类没有扩展override func setValue(_ value: Any?, forKey key: String) { }
类,怎么能覆盖它的超类方法呢?
您无法扩展NSObject
课程,但您必须从代码中删除NSObject
关键字,因为override
将成为您的自定义类的方法。如果你这样做,你将无法明显地致电setValue
。