swift 面向协议,swift 是面向对象编程还是面向过程还是其他编程

1,swift 是面向对象编程还是面向过程还是其他编程Swift有面向过程 , 也有面向对象,也有面向协议 。其实很多语言都是这样的面向对象编程,oc的很多方法 , swift都可以用Swift是面向协议编程再看看别人怎么说的 。
2,swift 是面向对象编程还是面向过程还是其他编程Swift有面向过程,也有面向对象,也有面向协议 。其实很多语言都是这样的
3,Swift中结构体和类的区别两者之间的关系定义:结构体有0个或多个相同或者不同的数据组合而成的数据集合 , 其中那些数据或者方法被称为结构体的成员或者是成员方法 。格式:struct name:<:protocal>var 成员1:数据类型var 成员2:数据类型….}要注意的地方:结构体是值类型,其 实例将会被赋予变量或者常量和被函数调用时被复制结构体中的成员可以包括属性、类型别名、数组、其他结构体和枚举声明结构体声明不能包含析构器或者协议声明,但是可以包括任意协议的实现 , 不能继承类、枚举、其他结构体两者间的区别在我们实际的开发中,可能会纠结于应该是使用类还是结构体,在这里我也总结了一下类与结构体间的一些区别 。结构体:///MARK: - 结构体struct Car var name: String!init(name: String)self.name = name}}var p1 = Car(name: "bench")var p2 = p1p2.name = "BMW"print(p2.name,p1.name)/// 打印结果为BMW,bench类:///MARK: - 类class Carvar name: String!init(name: String)self.name = name}}var p1 = Car(name: "bench")var p2 = p1p2.name = "BMW"print(p1.name,p2.name,p1.name)/// 打印结果为BMW,BMW,BMW从上面的结果可以看出来,再次给对象赋值,结构体不会改变,而类则会改变原来的值 , 所以说明类的对象是引用类型,而结构体是值类型 。还有的区别就是类是属于面向对象编程 , 结构体属于面向协议的编程,所谓面向协议编程其实就是面向对象的升级 。在swift中推荐使用的是使用结构体,类在swift中不处于主流的地位,还有就是结构体也能够实现类的全部功能,结构体更模块化,默认实现初始化方法并且不用考虑ARC 。结构体只需要给出变量的类型,不用给出初始值struct car var name: String}类则需要给出初始值class car var name: Stringinit(name:String) self.name = name}}上面两种的效果一样 。【swift 面向协议,swift 是面向对象编程还是面向过程还是其他编程】
4,1Swift语言特点swift的特点:1、swift是一种强类型语言,所有变量在声明或者定义的时候会确定类型,并且这个类型不能再被修改 。2、swift是安全的 , 强类型是安全性的体现之一 。3、swift所有的变量(可选型除外)都必须经过初始化才能访问使用,(1)、非可选型变量 , 必须初始化,在结构体和类中 , 未初始化的非可选型属性,必须在构造函数中先进行初始化(2)、可选型显式声明?:如String?,无需初始化,默认值为nil,使用时需要解包返回确切类型数据使用隐式声明!:如String!,也无需要初始化,默认值nil,可以解包,也可以不解包直接使用,也就是说,比var t:String! = "TEST" , 如果有一个变量a是String类型,一个变量b是String?类型 , 那么若a = t,那么可选型t就无需解包,直接返回一个确切的String类型,而b = t,则是返回一个可选型,这种可选型根据实际需要自动处理Optional方式声明:需要初始化,这种方式不会自动初始化一个nil值,并且这种方式的也是显示声明4、swift数据类型分值类型和引用类型:值类型:一般内存分配在栈中,进行赋值都是深拷贝,会开辟全新的内存空间给新变量,对新变量修改不会影响原变量 , 结构体(struct)、枚举(enum)等都是值类型,像Int、Double、Float、元组、String、Array、Dictionary、Set等 , 实质都是struct,所以也是值类型引用类型:就是指针,一般内存分配在堆中,进行赋值会只拷贝值的内存地址,不会开辟新的内存空间给新变量存储值,对新变量修改会影响原变量,像类、闭包、函数等,都是引用类型5、_在swift中有特殊的意义,一般使用来 , 用于占位进行忽略,比如函数参数名忽略,比如10_000(跟10000一样 , 但是加_后更易读)6、swift语言,在类的继承上,方法是可重写的 , 而在类中,方法也是可重载的7、swift中,可选型的本质是枚举8、swift是面向协议的语言:(1)、swift语言是面向对象的 , 但是swift标准库中,基础类只有几个,而协议类型却有几十个 , 充分说明了swift语言中协议的重要性(2)、与OC中的协议不同的是,swift的协议是可多继承和扩展的,并且协议里不仅可以有方法 , 还可以有属性,这是OC的协议不具备的,在swift中,协议的存在 , 能更好的去抽象出两个不同事物的共同特性,做到一些类无法做到的是,比如飞机和鸟,明显不同类型,也没有继承关系的两种类型,他们都有翅膀、都会飞行的共同性,最好的选择就是协议了5,swift3取消了cgrectmake吗一、语法改进1、extension 中可以访问 private 的属性2、类型和协议的组合类型,两种不同类型可以用 & 表示组合3、associated type 可以追加 where 约束语句4、新的 key paths 语法,比如#keypath(kid.nickname) 可以写为 \kid.nickname5、下标支持泛型二、字符串1、unicode 字符串在计算长度时性能提高2、更快的字符处理速度,对英语、法语、德语和西班牙语的处理速度提高了3.5 倍,对中文和日语的处理速度提高了2.5倍3、去掉了string的characters属性用法,直接调用string对象本身即可4、语法糖省略号“...”符号用于字符串取单侧边界5、字符串可以当作collection集合使用6、多行字符串可以用三个引号括起(我超喜欢这个)三、foundation标准库1、对象持久化兼容了codable协议,即可以转换为json或者propertylist(xml)2、sequence改进,追加了where子句 , 避免了不必要的类型判断3、面向协议的整数,支持定长整数4、字典和集合增强 , 可以关键词可以重复、允许有默认值、可以分组、可以翻转5、nsnumber与普通数字变量可以桥接6、可变内容集合可以交换两个元素的位置四、编译改进1、预编译速度改进2、编译与程序索引同时进行3、优化内存4、删除未调用协议5、减少隐式@objc自动推断五、独占内存六、兼容性:同时集成swift 3.2和swift 4.0CGRect现在可以用新的 CGPoint、CGSize实例代替了,详见以下内容:let rect = CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 100, height: 100))let rect = CGRect(x: 0, y: 0, width: 100, height: 100) // CGFloat, Double, Intlet point = CGPoint(x: 0,y :0) // CGFloat, Double, Intlet size = CGSize(width: 100, height: 100) // CGFloat, Double, Intlet size = CGSize.zero // width = 0, height = 0let point = CGPoint.zero // x = 0, y = 0, equal to CGPointZerolet rect = CGRect.zero // equal to CGRectZeroCGRectZero 和 CGPointZero 在 Swift 3.0 已经被 CGRect.zero & CGPoint.zero代替了 。6,OC和Swift哪个未来的趋势更好呢oc和swift毕竟都是苹果开发出来的语言 。oc有自己的点,用户比较多,使用时间比较长 。swift虽然写起来优美,自然,但是它毕竟有别的语言的影子,java ,  js都有 。oc时间长,目前为止,大家都是在用oc在开发,网上资料多如牛毛 。swift刚出来 , 资料也就是苹果的官方文档,不过随着xcode6的beta版更新, swift也在小小的更新 。swift的优势,是对于你已经有其他的开发语言基础而言的,因为是刚出来的 ,  所以,它很新,吸收了很多其他语言的优点为已所用 。当用它来开发的时候,程序员应该很happy(所谓的高效)像这类问题 , 什么东西趋势好、有前景,都并不是很有意义 。在将来的团队中,必然有一些模块需要用Objective-C写 , 或许是因为Swift没有C语言的底层表达的能力,反之也有一些模块用Swift写可以避免Objective-C的陷阱,比如内存管理 。我的建议是以一种语言为主攻方向,另一种则了解其大致原理 。再者,Objective-C和Swift都只是“工具”,如果不对其他比如应用层、应用领域、安全性的基本知识了解的话 , 代码质量也不能得到提升 。所以另一方面,也要扩展应用和安全方面的知识 。OC与swift1.协议OC:主要用来传值swift:不仅可以用来传值,swift中的协议可以定义属性方法,并且其协议可以进行扩展,在扩展中还可以有自己的默认实现,这个特性使其可以面向协议的时候非常强大 。例://如果遵守了swift中的协议,那么里边的非扩展方法必须实现protocol AnimationProtocol var maxAge: Int //动物都有自己的名字func name()}//swift中的协议支持扩展 , 并且可以再扩展中直接实现具体内容(扩展中不可以定义属性方法),似乎跟OC中的继承一样extension AnimationProtocol func eat() print("eat");}}class Dog: AnimationProtocol var maxAge: Int get }}//name必须实现func name() print("name: dog")}//可以实现也可以省略(类似继承中的复写)func eat() print("eat shit")}}class Cat: AnimationProtocol var maxAge: Int get }}func name() print("name: cat")}}使用继承很容易出现父类越来越臃肿特别是多重继承时,最终变成方法垃圾场的情况;但是利用swift的协议,可以实现类似于继承的功能 , 但是比继承更加灵活;当某几个类有共同特性的时候可以抽出一个协议,使用的时候遵守此协议即可 , 可以解放父类 。2.泛型泛型在很多功能上看似可以用多态实现,但还是有很多区别的 。自己目前为止的看法,如下是使用泛型的例子:static func set<T>(_ key: String, value: T) stdDefaults.set(_T<Any>.cast(value), forKey: key)stdDefaults.synchronize()}static func get<T>(_ key: String) -> T? }那么如果将泛型改为多态,如下:static func set(_ key: String, value: Any) stdDefaults.set(value, forKey: key)stdDefaults.synchronize()}static func get(_ key: String) -> Any? }会有什么问题呢?一个简单的例子,如果我获取的是一个model , 那么如果是多态,使用应该是这样的:let model = Model()SDB.set("model", value: model)let md = SDB.get("model") as? Model//使用了as?说明这是类型转换如果是泛型,使用应该是这样的:SDB_T.set("model", value: model)let md_t: Model? = SDB_T.get("model")//前边添加类型,属于泛型的特征类型推断//static func get<T>(_ key: String) -> T?类型推断是swift特有的 , 比如说let str = "",swift可以推断出str为String类型下边是一个项目中很有用的自定义去重算法://去重算法 Equatable 判等协议func removalAlgorithm<T: Equatable>(a: [T], b:T) -> [T] items.remove(at: i)}}return items}而mode中所要实现的协议如下:class Model: Equatable var mId: Int?var a: String?static func == (lhs: Model, rhs: Model) -> Bool }return false}}上边的方法,如果不用泛型,想使用可能就比较麻烦了,需要各种类型转换 。3.结构体和类oc和swift中结构体何磊的类型是相同的 , 即结构体是值类型,class是指针类型 。但是swift中结构体更强大 , 可以实现很多类似于类的功能,目前swift中的Array,Dictory,String均为结构体 , 因此这些常用的数据类型用法有比较大的差异 。String为例:OC中两个字符串对象是不可以直接用==进行比较的,但是swift就可以(数组,字典同理) 。既然是值类型 , 那么有些运算符就可以直接使用 , 如+:func test() var arr1 = [1]let arr2 = [2]arr1 = arr1 + arr2print(arr1 == arr2)}4.?&!swift是类型确定型语言,对类型是否有值有严格要求,因此引入了?和!来对值进行明确 。oc中如下:- (NSString *)test }这样写在oc中是完全没有问题的 , 但是使用者可能就比较麻烦了,因为外部使用者并不能确定这个有没有值,因此每个使用此方法的人都需要去判断返回值是否符合自己预期;swift中如下:func test() ->String return nil}这样写在swift中是会报错的,因为你的返回值String没有带?因此默认是一个非空的 , 所以此函数的作者就需要去考虑如果这儿是空或者这儿的类型不是我想要的,我要做哪些补救措施,其实就是从源头上对一些错误特别是野指针问题做了预防 。那么在swift中怎么正确使用这一特性呢?1.在某些场景下,你确定此函数会返回一个有效值,那么你就可以在返回值后边加!或者默认不加;func test() ->String }2.有时候我们就是要告诉外边,这个不一定是有效的 , 需要外部使用者自己处理,那就在返回值后便加?;func test() ->String? }5.??swift中多了一种??判断符 , 它的作用类似三元运算符,但是使用场景比较多的地方是对一个为空的值做询问,如果为空怎么怎么样,如下:func test(_ a :String?) ->String? return a ?? ""}作者:wordlesser链接:https://www.jianshu.com/p/818539a539e4来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处 。

    推荐阅读