swift 为什么需要使用NSObject?

kh212irz  于 2023-04-04  发布在  Swift
关注(0)|答案(3)|浏览(217)

我很困惑,如果我需要使用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?有什么好处?*

5t7ly7z5

5t7ly7z51#

NSObject类:

这个类是大多数Objective-C类层次结构的根类,子类继承了运行时系统的基本接口和作为Objective-C对象的能力。

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,稍后可以相应地隐式类型转换。

vlju58qv

vlju58qv2#

你正在重写一个超类方法:

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

所以,如果你的类没有扩展NSObject类,怎么能覆盖它的超类方法呢?
你不能扩展NSObject类,但你必须从代码中删除override关键字,因为setValue将成为你自定义类的方法。如果你这样做,你显然不能调用super.setValue(value, forKey: key)

xzv2uavs

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
无论你是否应该为所描述的原始情况做这件事,我认为这取决于你正在做的事情的细节。

相关问题