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

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

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

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

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

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

5 控制流

  • if--let

    if-let一般用于可选类型变量的判断
    
    if let n = name{
    //当name有值的时候会定一个常量n去记录此时这个可选类型的值
    并且能够进入到判断语句代码块中
    }
如果变量name没有值的话继续往下面执行
  • if-let-where

    if-let-where用法类似于if-let,多了一个判断
    
    . where 就是给前面定义出来的常量再添加一个判断 (where 后面的执行语句的执行结果必须为 true/false)
    . 如果需要在 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 本类名:协议名
{
}

记OC迁移至swift中笔记20tips的更多相关文章

  1. 30.怎样在Swift中添加运行时属性?

    和OC一样,Swift中也可以添加运行时属性.下面将提供一个完整的例子,演示如何给按钮点击事件添加运行时属性. 1.示例 import UIKit var s_GofButtonTouchDownKe ...

  2. Swift学习笔记十二

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

  3. 一览Swift中的常用关键字

    要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在Swift中常用到的关键字. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...

  4. Swift学习笔记 - OC中关于NSClassFromString获取不到Swift类的解决方案

    在OC和Swift混编的过程中发现在OC中通过NSClassFromString获取不到Swift中的类,调研了一下发现问题所在,下面是我的解决方案: 问题的发现过程 UIViewController ...

  5. Swift: 比较Swift中闭包传值、OC中的Block传值

    一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...

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

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

  7. 如何在swift中实现oc中的分类

    在oc中为了增强已有类的功能,我们经常使用分类.使用分类,我们可以在不破坏原有类的结构的前提下,对原有类进行模块化的扩展. 但是在swift中没有分类这种写法了.相对应的是swift中只有扩展(Ext ...

  8. swift 中使用OC第三方库(以AFNetworking为例)

    首先呢  把你需要的第三方库导入到你的项目中来  具体怎么导入 这不是这篇的重点  看上一篇 废话不多  直接上 (1)在项目中直接建一个 oc 的控制器  然后xcode会提醒你  要不要建造桥接文 ...

  9. 在Swift中实现 oc与swift的混编

    在Swift中想要引用OC头文件(import),可采用混编的方法,这里以sqlite为例,采用OC-Swift桥的方式实现添加头文件1引入sqlite数据库的库文件 打开工程配置文件,在build ...

随机推荐

  1. [Windows] 批处理文件系统服务控制

    在cmd下可有两种方法打开,net和sc. net只能用于用于打开没有被禁用的服务. 启动: net start 服务名 停止: net stop 服务名 sc可打开被禁用的服务. sc config ...

  2. wcf服务返回json

    private static void CreateErrorReply(OperationContext operationContext, string key, HttpStatusCode s ...

  3. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第3部分)(完结)

    一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法 ...

  4. Win10 + VS2015 下编译 Qt5.6.0

    近期由于另外一个项目需要用 vs2015 ,于是把 Qt 也升级到了 5.6.0 .由于项目需要兼容 Windows xp ,所以需要自己编译 Qt .这里大致整理一下编译的过程. 安装 Active ...

  5. doctrine2到底是个什么玩意

    之前和最近一个项目用到了Doctrine,由于是别人搭建的,自己没有很了解,最近又开始做的时候发现拙荆见肘,于是看了一下doctrine教程,本文就是加上自己理解的doctrine教程文档笔记了. D ...

  6. Gradle学习系列之九——自定义Task类型

    在本系列的上篇文章中,我们学习了多Project构建,在本篇文章中,我们将学到如何自定义Task类型. 请通过以下方式下载本系列文章的Github示例代码: git clone https://git ...

  7. Node.js面试题:侧重后端应用与对Node核心的理解

    Node是搞后端的,不应该被被归为前端,更不应该用前端的观点去理解,去面试node开发人员.所以这份面试题大全,更侧重后端应用与对Node核心的理解. node开发技能图解 node 事件循环机制 起 ...

  8. jquery选择器(原创)<二>

    jquery选择器,选择接着学: 前面学习了基本选择器中的CSS选择器,现在学层级选择器: 1.子元素选择器 子元素选择器,用于在给定的父元素下,查找这个父元素下面的所有的子元素,语法格式,如下: $ ...

  9. C#设计模式——适配器模式(Adapter Pattern)

    一.概述在软件开发中,常常会想要复用一个已经存在的组件,但该组件的接口却与我们的需要不相符,这时我们可以创建一个适配器,在需复用的组件的接口和我们需要的接口间进行转换,从而能够正常的使用需复用的组件. ...

  10. 加密–RSA前端与后台的加密&解密

    1. 前言 本问是根据网上很多文章的总结得到的. 2. 介绍 RSA加密算法是一种非对称加密算法. 对极大整数做因数分解的难度决定了RSA算法的可靠性.换言之,对一极大整数做因数分解愈困难,RSA算法 ...