Swift class和struct异同点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift class和struct异同点相关的知识,希望对你有一定的参考价值。
参考技术A 1.定义属性用于存储值 ( property )
2.定义方法用于提供功能 ( function )
3.定义下标操作使得可以通过下标语法来访问实例所包含的值 ( subscript )
4.定义构造器用于生成初始化值 ( initializers )
5.通过扩展以增加默认实现的功能 ( extension )
6.实现协议以提供某种标准功能 ( protocol )
1.class是引用类型;struct是值类型
2.class支持继承;struct不支持继承
3.class声明的方法修改属性时不需要 mutating 关键字;struct需要
4.class中每一个成员变量都必须被初始化,否则编译器会报错,而 struct 不需要,编译器会 自动帮我们生成init函数 ,给变量赋一个默认值
5.class支持引用计数(reference counting)(允许对一个类的多次引用),struct不支持
6.class支持type casting(类型转换)(允许在运行时检查和解释一个类实例的类型),struct不支持
7.class支持deinitializers(析构器)(允许一个类实例释放任何其所被分配的资源),struct不支持
8.变量赋值方式不同(深浅copy),class浅拷贝,struct深拷贝,class的赋值是传递引用,struct则是copy传值,不是使用引用计数。
9.内存管理:struct存储在stack中,class存储在heap中、
10.方法派发方式:struct的方法调用是 静态绑定 ,而class的方法调用是 动态实现
Tip: class的对象是引用类型,而struct是值类型。所以class的赋值是传递引用,则是copy传值,不是使用引用计数。
class为了支持的额外功能则会增加其复杂性。一般,更倾向使用选择struct和enum,因为他们更容易理解,而class,则在合适和必要的时候使用。实际上,这意味着 大多数的自定义数据类型定义为struct和enum就可以 了。
class和struct的选择
struct实例总是通过值传递,class实例总是通过引用传递。这意味两者适用不同的任务。当你在考虑一个工程项目的数据结构和功能的时候,你需要决定每个数据结构是定义成struct还是class。
按照通用的准则,当符合一条或多条以下条件时,请考虑构建 struct :
总结起来就是一句话:能使用struct就不要使用class
为什么优选struct:
恒等运算符
因为class是引用类型,有可能有多个常量和变量在幕后同时引用同一个类实例。(对于struct和enum来说,这并不成立。因为它们作为值类型,在被赋予到常量、变量或者传递到函数时,其值总是会被拷贝。)
如果能够判定两个常量或者变量是否引用同一个类实例将会很有帮助。为了达到这个目的,Swift 内建了两个恒等运算符:
Swift4.0 新特性 Struct与Class的区别
1、类拓展里面的方法不能被子类复写
1 class UserDataDao { 3 let realm = try! Realm() 5 func test1() { 7 } 9 } 10 extension UserDataDao { 13 func test2() { 15 } 16 } 17 class KCLDataDao:UserDataDao { 18 19 override func test1() { 21 } 22 // 报错:Declarations from extensions cannot be overridden yet 23 override func test2() { 25 } 26 }
2、filter map函数
filter很明显是过滤一些东西、map是映射、可以将输入的东西映射为不同类型的数据,如下
let array = [1,2,4,5,6] let arr2 = array.filter { (index) -> Bool in if index > 2{ return true //此处如果是正确的将保存 } return false //为false 被清除掉了 }.map { (index) -> String in //String 是可以自定义你所需要的类型 return "11\(index)" //转换为string类型的数据 }.filter { (str) -> Bool in if str == "114"{ return true } return false } let arr2 = array.filter{$0>1}.map{$0+2} print("arr2=\(arr2)")
3、swift3使用#selector指定的方法,只有当方法权限为private时需要加@objc修饰符,现在Swift4.0全都要加@objc修饰符
registerBtn.addTarget(self, action: #selector(self.buttonClick), for: .touchUpInside) @objc func buttonClick() { }
4、新增filePrivate
1 class UserDataDao { 2 3 fileprivate func test1() { //如果这里是private 4 print("UserDataDao test1") 5 } 6 } 7 extension UserDataDao { 8 func test2() { 9 print("UserDataDao test2") 10 } 11 } 12 class KCLDataDao { 13 14 func test() { 15 let user = UserDataDao() 16 user.test1() //这里报错 17 user.test2() 18 } 19 }
5、swift中 struct与class的区别
1:struct不能继承、自然也不存在对成员属性和成员方法, 类属性和类方法的重载
2:struct构造函数, 会自动生成带参数的构造器。class不会对有初始化赋值的属性, 生成带参数的构造器。
class UserDataDao { var name:String? let realm = try! Realm() fileprivate func test1() { print("UserDataDao test1") } } extension UserDataDao { func test2() { print("UserDataDao test2") } } struct UserDataDbo { var name:String? let realm = try! Realm() fileprivate func test1() { print("UserDataDao test1") } } extension UserDataDbo { func test2() { print("UserDataDao test2") } } class test:UserDataDao{ func test3() { let dao = UserDataDao() let boo = UserDataDbo() dao.test1() boo.test1() } } struct test2:UserDataDbo {//Inheritance from non-protocol type ‘UserDataDbo‘ 报错 }
以上是关于Swift class和struct异同点的主要内容,如果未能解决你的问题,请参考以下文章