2016-12-30 76 views
0

我很困惑,我应该需要使用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的?有什么优势?

+0

它必须是'NSObject'来覆盖函数'setValue(_:forKey :)' – Desdenova

+0

@Desdenova更新我的问题!你能告诉我为什么需要使用NSObject吗?有什么优势? –

+0

我不明白你的问题后,你的评论。你不需要使用'NSObject',你甚至不需要一个类。结构也可以容纳这些。 – Desdenova

回答

0

你要覆盖一个超类方法:

override func setValue(_ value: Any?, forKey key: String) { } 

所以,如果你的类没有扩展NSObject类,怎么可能覆盖它的父类的方法?

您无法扩展NSObject类,但您必须从代码中删除override关键字,因为setValue将成为您的自定义类的一种方法。如果你这样做,你显然不能拨打super.setValue(value, forKey: key)

+0

谢谢我更新我的问题。你可以检查,请 –

+0

你已评论'setValue'方法,我应该检查什么? – lubilis

+0

请指导我也是使用NSNumber的最佳实践 –

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以后可以类型转换隐含相应。