我很困惑,如果我需要使用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?有什么好处?*
3条答案
按热度按时间5t7ly7z51#
NSObject类:
这个类是大多数Objective-C类层次结构的根类,子类继承了运行时系统的基本接口和作为Objective-C对象的能力。
AnyObject协议:它是对任何对象的隐式确认。
当你需要一个非类型化对象的灵活性,或者当你使用桥接的Objective-C方法和属性返回一个非类型化的结果时,你可以使用AnyObject。AnyObject可以作为任何类、类类型或仅类协议的示例的具体类型。
AnyObject也可以用作连接到Objective-C类的类型示例的具体类型。
AnyObject协议的灵活行为类似于Objective-C的id类型。因此,导入的Objective-C类型经常使用AnyObject作为属性、方法参数和返回值的类型。(source)
因此,您可以将
NSNumber
变量用作AnyObject
,稍后可以相应地隐式类型转换。vlju58qv2#
你正在重写一个超类方法:
所以,如果你的类没有扩展
NSObject
类,怎么能覆盖它的超类方法呢?你不能扩展
NSObject
类,但你必须从代码中删除override
关键字,因为setValue
将成为你自定义类的方法。如果你这样做,你显然不能调用super.setValue(value, forKey: key)
。xzv2uavs3#
我一直在重新学习许多核心的swift概念,所以我添加这个答案,因为我认为这是(实际上)被问到的问题。
“我正在看这段代码,为什么要用途:
class App: NSObject {
而不是
class App: {
???”
一种回答方式:
当你在写你自己的类时,如果你有一个“好的理由”,你只应该在声明中添加其他类。
也就是说:你想要子类化那个类,因为你得到了一些东西,比如它的属性、方法或协议。
例如,我们经常认为
UIView
的行为是理所当然的,它实际上被定义为:@MainActor class UIView : UIResponder
UIView
为我们做的很多事情通常都是“来自”UIResponder
。如果Apple没有这样做,这个视图对用户来说仍然是非常好看的,但是如果视图不是交互式的,你的应用可能会非常无聊(记住,
UIView
是许多其他UIKit
类的超类。Apple没有在他们的类文档中列出子类,所以这一点并不清楚。)回到您的代码,如果您想使用
override func setValue
,则需要使用NSObject
。https://developer.apple.com/documentation/objectivec/nsobject/1418139-setvalue
无论你是否应该为所描述的原始情况做这件事,我认为这取决于你正在做的事情的细节。