OC与swift

1.协议

OC:主要用来传值
swift:不仅可以用来传值,swift中的协议可以定义属性方法,并且其协议可以进行扩展,在扩展中还可以有自己的默认实现,这个特性使其可以面向协议的时候非常强大。

例:

//如果遵守了swift中的协议,那么里边的非扩展方法必须实现
protocol AnimationProtocol {//最大年龄(属性方法)var maxAge: Int {get}//动物都有自己的名字func name()
}//swift中的协议支持扩展,并且可以再扩展中直接实现具体内容(扩展中不可以定义属性方法),似乎跟OC中的继承一样
extension AnimationProtocol {func eat() {print("eat");}
}class Dog: AnimationProtocol {//maxAge必须实现var maxAge: Int {get {return 20}}//name必须实现func name() {print("name: dog")}//可以实现也可以省略(类似继承中的复写)func eat() {print("eat shit")}}class Cat: AnimationProtocol {var maxAge: Int {get {return 10}}func name() {print("name: cat")}
}

使用继承很容易出现父类越来越臃肿特别是多重继承时,最终变成方法垃圾场的情况;
但是利用swift的协议,可以实现类似于继承的功能,但是比继承更加灵活;当某几个类有共同特性的时候可以抽出一个协议,使用的时候遵守此协议即可,可以解放父类。

2.泛型

泛型在很多功能上看似可以用多态实现,但还是有很多区别的。

自己目前为止的看法,如下是使用泛型的例子:

static func set<T>(_ key: String, value: T) {let stdDefaults = UserDefaults.standardstdDefaults.set(_T<Any>.cast(value), forKey: key)stdDefaults.synchronize()}static func get<T>(_ key: String) -> T? {let stdDefaults = UserDefaults.standardlet value: Any? = stdDefaults.value(forKey: key)return _T<T>.cast(value)}

那么如果将泛型改为多态,如下:

static func set(_ key: String, value: Any) {let stdDefaults = UserDefaults.standardstdDefaults.set(value, forKey: key)stdDefaults.synchronize()}static func get(_ key: String) -> Any? {let stdDefaults = UserDefaults.standardlet value: Any? = stdDefaults.value(forKey: key)return value}

会有什么问题呢?

一个简单的例子,如果我获取的是一个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] {var items = afor i in 0..<a.count {let item = a[i]if item == b {items.remove(at: i)}}return items}

而mode中所要实现的协议如下:

class Model: Equatable {var mId: Int?var a: String?static func == (lhs: Model, rhs: Model) -> Bool {if lhs.mId == rhs.mId {return true}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 {return nil;
}

这样写在oc中是完全没有问题的,但是使用者可能就比较麻烦了,因为外部使用者并不能确定这个有没有值,因此每个使用此方法的人都需要去判断返回值是否符合自己预期;

swift中如下:

func test() ->String {//错误的写法,编译器会报错return nil}

这样写在swift中是会报错的,因为你的返回值String没有带?因此默认是一个非空的,所以此函数的作者就需要去考虑如果这儿是空或者这儿的类型不是我想要的,我要做哪些补救措施,其实就是从源头上对一些错误特别是野指针问题做了预防。
那么在swift中怎么正确使用这一特性呢?
1.在某些场景下,你确定此函数会返回一个有效值,那么你就可以在返回值后边加!或者默认不加;

 func test() ->String {return ""}

2.有时候我们就是要告诉外边,这个不一定是有效的,需要外部使用者自己处理,那就在返回值后便加?;

5.??

swift中多了一种??判断符,它的作用类似三元运算符,但是使用场景比较多的地方是对一个为空的值做询问,如果为空怎么怎么样,如下:

 func test(_ a :String?) ->String? {//如果a为空,则返回空字符串(其实这样写,返回值已经不可能为空了)return a ?? ""}


作者:wordlesser
链接:https://www.jianshu.com/p/818539a539e4

ios 可以为空声明_iOS开发中使用OC和swift的对比(2)相关推荐

  1. ios支付 选择货币_iOS开发中金钱货币的计算问题

    ios开发中涉及到和货币价格计算相关的,都需要注意计算精度的问题. 服务器有可能返回的金钱是int float double string NSNumber, 单纯的float.double的计算都会 ...

  2. ios 扇形 按钮_IOS 开发中画扇形图实例详解

    IOS 开发中画扇形图实例详解 昨天在做项目中,遇到一个需要显示扇形图的功能,网上搜了一下,发现code4app里面也没有找到我想要的那种类似的效果,没办法了,只能自己学习一下如何画了. 首先我们需要 ...

  3. swift 同步 网络请求_IOS开发中异步网络请求上实现同步逻辑

    IOS开发中异步网络请求上实现同步逻辑 前提: 可能遇到一些问题,比如上传多个数据,需要等多个数据上传成功后做一定的处理,而且一个个上传,万一哪个上传失败了,后面就不需要上传了,直接报错. 之前ASI ...

  4. ios 获取沙河文件夹_iOS开发之获取沙盒路径

    iOS开发之沙盒机制(SandBox)详细讲解了沙盒的一些机制.在开发中,我们需要对沙盒进行操作,所以我们需要获取到沙盒路径. 沙盒里的文件夹包括Documents.Library.tmp.这三个文件 ...

  5. ios label 高度紫石英_IOS开发中UILabel自适应大小显示的方法

    1,根据label中的文字内容自动换行显示的方法 1>,认识两个属性 @property(nonatomic) NSIntegernumberOfLines; @property(nonatom ...

  6. ios realm 文件_iOS开发中使用Realm数据库

    // 查 RLMResults * dogs = [LSDog allObjects]; NSLog(@"===%@", dogs); RLMResults * pers = [L ...

  7. ios 顶部tab滑动实现_iOS开发之多表视图滑动切换示例(仿头条客户端)

    好长时间没为大家带来iOS开发干货的东西了,今天给大家分享一个头条新闻客户端各个类别进行切换的一个示例.在Demo中对所需的组件进行的简单封装,在封装的组件中使用的是纯代码的形式,如果想要在项目中进行 ...

  8. ios 保存图片到相册 崩溃_iOS开发之 保存图片到相册(相机胶卷)

    平时开发APP时难免会遇到保存图片到相册的相关操作,具体我么可以直接保存到系统的相机胶卷, 也可以自定义相册保存图片,下面我们就一起来看一看. 保存图片到系统相册 先看看比较简单的直接保存图片到系统相 ...

  9. ios保存gif到相册_iOS相册中的GIF图片的读取与保存

    大家都知道iOS的系统相册是不支持gif图片预览的.但是,这并不代表系统相册不能保存和读取gif图片.通过Safari长按gif图片,选择保存到相册,这时保存到相册里的图片就是gif的,虽然它不会动. ...

最新文章

  1. oracle 的 import,ORACLE import工具参数
  2. Wireless-N Configuration
  3. 计算机网络双语名词,计算机网络中英文名词对照
  4. hdu3033---加限制条件的0-1背包
  5. 数据结构与算法--解决问题的方法- 二叉树的的镜像
  6. android md 颜色,安卓MD(Material Design)规范
  7. Java环境搭建一个小型网页
  8. winfrom axacropdf预览pdf怎么一直显示_PDF合并怎么做?分享多个PDF文件合并的方法...
  9. 果然十三香!iPhone13系列正式发布:看到价格后酸了
  10. Atitit 长距离无线通信法 LoRa NB-IoT NB-CIoT LoRa是Semtech公司的创新发明,该技术向用户提供显著的长距离、低功耗、安全数据传输机制。使用LoRa技术构建的公用网
  11. PreparedStatement 原理
  12. 智能机器人需要机器视觉
  13. 如何用python爬取抖音视频列表
  14. Bloodsucker 【 ZOJ - 3551】
  15. 利用丁香园数据生成疫情分布地图(R语言)
  16. Kettle数据从txt到数据库表,表到文件
  17. 什么是基于模型的测试?
  18. 【Android控件】HorizontalScrollView的基础使用记录(滚动条自定义)
  19. scrum认证费用_如何获得专业Scrum大师的认证-快速和慢速方式
  20. crash: mod命令

热门文章

  1. opencv1-加载、修改、保存图像
  2. Python unittest中初始化固件setUp和销毁固件tearDown详解
  3. 【Python】shutil内置模块复制和重命名文件
  4. 【Python】retrying模块使用场景
  5. vs.net各版本解决方案相互转换工具
  6. 记一次面试腾讯的奇葩经历
  7. linux 时间同步ntp
  8. 内连接、左外连接、右外连接、交叉连接区别
  9. 赛门铁克运维注意事项
  10. 在Javascript中闭包(Closure)