NSObject与Struct的区别

7
我想知道NSObjectstruct之间的区别。以下示例将解释两种情况。
struct中:
struct UserDetails{
    var userName:String
    var userID:String
    var userAge:String
    func userDescription()->String{
        return "name " + userName + "age " + userAge
    }
}

在 `NSObject` 类中
class UserDetails: NSObject {
    var userName:String?
    var userID:String?
    var userAge:String?
    func userDescription()->String{
        return "name " + userName! + "age " + userAge!
    }
}

请问在哪些情况下需要使用NSObject类,哪些情况下需要使用struct
2个回答

6

1) 结构体按值传递,类实例按引用传递。

2) 类可以被子类化,结构体不行。

无论Class是否是NSObject的子类(基本上)都是无关紧要的。你可以同样地说:

class UserDetails {
    var userName:String?
    var userID:String?
    var userAge:String?
    func userDescription()->String{
        return "name " + userName! + "age " + userAge!
    }
}

1
我不确定这里面有多少内容 - 这实际上是一个设计决策。如果您将来需要进行子类化,则应使用Class。如果您知道永远不会进行子类化,则可以使用Struct。 - Grimxn
1
两者都不是最好的选择,具体取决于情况而定。类需要引用计数、指针间接和内存分配,但结构体需要进行复制。 - Catfish_Man
1
换句话说,如果你在程序中频繁传递大量结构体,它们将比对象慢得多,并使用更多的内存。如果你不经常传递结构体,则结构体会更快并且使用更少的内存。基本上,如果你的代码运行速度太慢或使用太多内存,你应该考虑测试使用其他方法。 - Abhi Beckert
@newacct,你的用法“你只能通过指针来操作它们”让我感到困惑,因为尽管底层表示不同,但Swift的主要主题之一是在开发人员使用语言时从他们的语义中删除指针的概念。 - Grimxn
@Grimxn:无论你如何称呼它们,它们都是指针。指针=指向某个东西的东西。“引用类型”意味着其值为引用(指针)的类型。 - newacct

5
在Swift中,类和结构体要比许多其他编程语言更加相似。它们都可以有属性、方法、初始化程序、下标,并且可以遵循协议并进行扩展。然而,只有类可以利用继承和使用析构函数。由于类是通过引用使用的,因此可以拥有对同一实例的多个引用。
结构体在整个Swift中得到广泛应用--数组、字典、所有可选项等都基于struct类型构建,因此性能应该非常高。只有当您不需要类提供的继承或多个引用时,才可以使用struct。

1
哪一个会占用更多的内存? - Mani murugan
2
Optional 实际上是一个 enum,但它们类似于 struct - newacct

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接