写久了OC后来写swift,总感觉写着是swift的皮毛,但是实际上是OC的核心,这里整理了OC迁移至swift中的一些小细节。

1 在当前类中,实例方法调用属性以及方法都可以将self省略掉,而且是建议省略

2 selector是调用方法写法是:Selector("sayHello")或者是#selector(sayHello)

3 swift中不同类型的值之间不能直接做运算,所以不同类型值做运算的时候需要对值进行类型转化,都转化至同一类型之后方可做运算

可选类型如果一个变量可能有值也可能为空,那么这个变量就是属于可选类型。可选类型在变量的数据类型后边加上?,比如var str:String?

1 可选类型的值不能直接参与运算,需要强行解包之后才能使用,使用 `!`
2 标识强行解包某个可选类型的值。使用`!`一定要确定该值不为`nil`才可
3 以对这个值进行强制解包,如果对`nil`进行强制解包的话程序会崩溃

5 控制流

  • if--let

    if-let一般用于可选类型变量的判断if let n = name{//当name有值的时候会定一个常量n去记录此时这个可选类型的值
        并且能够进入到判断语句代码块中
    }

如果变量name没有值的话继续往下面执行
  • if-let-where

    if-let-where用法类似于if-let,多了一个判断1. where 就是给前面定义出来的常量再添加一个判断 (where 后面的执行语句的执行结果必须为 true/false)
    2. 如果需要在 if let 中更改定义的常量(其实需要将其改成变量),只需要将 let 改成 var就可以了

  • guard
guard比if-let少了一层代码嵌套guard var n = m else{当变量m的值为空的时候执行这里的代码块,执行结束之后return出去........return
}
不为空的话往下执行
printf(n)

6 switch

  • 不写break不会产生贯穿的现象,所以break可以不写

  • case可以判断任意类型(包括字符串等),不再像OC一样只能判断整型

  • 在 case 中不用写 {} 指定变量的作用域,但是每一个case后面都需要有执行代码

7 必选属性与可选属性

  • 必选属性需要在对象初始化完成之前必须有值

  • 如果是在构造函数之前给其赋值初始化的话,就必须在super.init() 之前

  • 基本数据类型如果为可选类型的话,默认值是nil

8 swift细化了属性的类型

  • 存储类型存储实例的变量和常量,与类,结构体,枚举相关

  • 计算属性并不存储实际的值,而是通过一个setter与getter方法来间接的获取和设置属性的值

  • 类型属性类型属性与类相关而不是与实例相关,对于某一类型的实例,类型属性都只有一份拷贝,类型属性只能通过类型来获取和操作

9 set方法与get方法

  • swift并不会像OC那样重写set与get方法
  • set方法写法

     var 变量名:变量类型?{didSet{set内容}}

  • 对于get方法swift推荐使用懒加载,在swift中懒加载有固定的写法

    lazy var 变量名:变量类型 = {//懒加载必须指明变量类型
          创建变量.......return 变量}()

  • 手动实现变量的setget方法

    var 变量名:变量类型?{didSet{set方法设置的内容}get{return ...}}

10 重写init(frame:CGRect)方法

  • 在swift中只要重写了UIView的init(frame:CGrect)方法就必须要重写init?(coder aDecoder: NSCoder)。否则会报错,这是因为采用纯代码重写了init方法,在以后的代码迭代的时候有可能会采用xib的方式,当采用xib的方法会执行init?(coder aDecoder: NSCoder)方法

11 swift中单例写法

  • swift中单例写法不建议使用OC的单例思想,swift中单例写法
 static let singleInstance:类名 = {let instance = 类名()return instance}()或者static let instance = 类名()let singleInstance:类名 = {return instance}

12 swift中遍历数组时候必须明确数组里面元素的类型

  for item in array as! [String:Anyobject]{}

13 根据字符串动态创建类实例:

swift中类进行实例初始化的时候会根据工程名称在类名前加上命名空间再初始化,所以根据一个类名字符串创建实例需要先获取类名空间

  • 在swift中,类名的组成是nameSpace.类名
  • 命名空间nameSpace一般是工程名,可以通过下面获取:
     let namespace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String

14 异常捕获try throw

  • try catch是swift对错误地处理,只要有错误参数error就必须对错误进行处理

    do{try  }catch{当有错误抛出的时候就执行catch里面的代码}//如果是强try(try!)的话有异常抛出的话直接崩溃,并不会跳转到catch里面去

15 CGRectOffset的使用

```//第一个参数:frame大小//第二个参数:x方向偏移的大小//第三个参数:y方法偏移的大小 CGRectOffset(frame,x,y) ```

16 按钮监听不能使用private修饰

  • 只在本类中使用的方法应该采用 private修饰,可以在一定程度上提高代码的可阅读性
  • 按钮的监听不能使用private修饰,因为按钮的监听是由runLoop来调用执行的,而不是本类来调用的,所以当按钮的监听采用private来修饰的时候程序会崩溃

17 闭包回调中应该接收一个optional类型的,不使用是强制解包,当闭包回调中如果有一个参数为nil的时候使用!强制解包就会造成程序崩溃

18 swift中的字典转模型

 init(dict){super.init()setValuesForKeyWithDictionary(dict)}

19 swift中可以通过点语法直接修改结构体里面的变量

  • 比如直接修改frame里面的x值
    btn.frame.origin.x = 0

20 swift中遵守协议的用法

  • 使用分类的形式
    extension 本类名:协议名{}

转载于:https://www.cnblogs.com/develop-SZT/p/5558854.html

记OC迁移至swift中笔记20tips相关推荐

  1. swift学习笔记-----swift中的指针

    swift语言为了简化,把指针隐形化了.没有像OC中那样的" * ".把底层的问题交给C语言去处理,我们可以在swift中调用C 语言来解决.当然,OC也是可以调用的. 但是在某些 ...

  2. Swift学习笔记十二

    方法 方法就是和某种特定类型相关联的函数.类.结构体.枚举都可以定义实例方法和类型方法.类型方法和OC中的类方法类似. 结构体和枚举也可以定义方法是Swift与C/OC之间很大的一个区别,在OC中,只 ...

  3. swift项目调用OC库 和OC项目 在swift文件里面全局调用OC库

    最近比较清闲,就把以前学习的过程记录下吧,多少年后如果能在互联网上找到自己的痕迹,想想还是一件蛮值得高兴的事情. 正好这两天加了一个swift学习群想继续学习swift,发现好多swift初学者,在混 ...

  4. Swift 中的关键字详解

    转载自:https://www.cnblogs.com/liYongJun0526/p/7522130.html 要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在S ...

  5. iOS 中 OC项目使用swift第三方工具(OC、swift 混合)

    OC项目引入swift, 1.建立 bridge 文件:在OC工程中新建swift文件,确认创建时,会提示建立 一个 项目名-bridging-header.h 文件. 2,建立 bridge 文件之 ...

  6. Swift: 在Swift中桥接OC文件(自己创建的类文件、第三方库文件)

    一.介绍 随着Swift的逐渐成熟,使用swift开发或者混合开发已经成为了一个趋势,本身苹果公司也十分推荐使用Swift这门新语言.目前Swift已经更新到了3.0,估计没有多久4.0就要出来了.那 ...

  7. OC Swift中UITextFiled、UITextView限制输入字数

    OC中限制字数的方法 我是用通知实现的,首先添加UITextFiled和UITextView的接收中心 [[NSNotificationCenter defaultCenter] addObserve ...

  8. Swift与OC混编过程中的配置

    女主宣言 在使用Swift进行iOS开发的过程中,经常涉及到Swift与OC混编的情况,有时主工程是OC的需要另外编入Swift代码,而有时主工程是Swift的需要另外编入OC代码.这其中涉及到修改一 ...

  9. OC和Swift中循环引用的问题

    总结一下自己对OC中和Swift中循环引用的认识. 一.OC中的循环引用分为类中的循环引用和对象之间的循环引用. 1.类的循环引用 造成原因: 在两个类的.h文件中使用了#import "& ...

最新文章

  1. 出色管理者的时间管理
  2. 总结-软件工程师 ( 编程能力 )
  3. .Net Core 3.0 gRPC部署问题解决
  4. Python3编程语言之enumerate() 函数使用示例
  5. 《Atlas基础教程》勘误(持续更新)
  6. erp服务器型号,erp服务器硬件配置
  7. 9型转x型 cobol_多重排斥、价值嬗变与农村跨省婚姻研究——以东莞宗族型X村为例...
  8. Oracle入门(九A)之用户的权限或角色
  9. 大数据之-Hadoop3.x_MapReduce工作流程---大数据之hadoop3.x工作笔记0109
  10. javascript中的正则表达式学习
  11. python字符串、字符串处理函数及字符串相关操作
  12. Win7缺失dll文件如何修复?Win7计算机丢失dll文件怎么办
  13. 2020年鼠年正月二十一 雪中送炭难
  14. ChatGPT突遭大面积封号!网友应急出解封教程
  15. python语言arrows用法_python时区运算,时区,时间戳,夏令时讲解
  16. DDD不够好用,你需要学习如何进行弹性软件系统设计
  17. Signal:python用信号处理程序的机制及用法举例
  18. 搭建Discuz论坛网站-最新版Discuz3.4
  19. Redis教程(上课笔记)
  20. gdb调试之快速入门

热门文章

  1. 超越Mask-RCNN:谷歌大脑的AI,自己写了个目标检测AI
  2. 星际2新智能体开源:单机并行能力强,适应环境广,个人可训练
  3. 华盛顿大学成立SAML实验室:陈天奇参与,推进未来AI系统全栈研究
  4. 索尼入局日本打车市场,联合6家出租车公司推AI打车软件
  5. Google Chrome 将禁止“退格键”作为后退按钮使用
  6. Oracle迁移到MySQL性能下降的注意点
  7. 遗传算法MATLAB工具箱的下载与安装
  8. 小米手机如何关闭悬浮球
  9. 烂泥:nagios学习(四):pnp4nagios图形化绘制nagios数据
  10. oracle dblink使用