为什么需要使用NSObject?

时间:2016-12-30 10:50:19

标签: ios swift swift3

我很困惑,我应该使用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?有什么好处?

2 个答案:

答案 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