记OC迁移至swift中笔记20tips

写久了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 本类名:协议名
    {
    }
时间: 2024-08-26 01:22:25

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

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

swift语言为了简化,把指针隐形化了.没有像OC中那样的" * ".把底层的问题交给C语言去处理,我们可以在swift中调用C 语言来解决.当然,OC也是可以调用的. 但是在某些场景下,这种调用可能不是很方便.比如,基于字节流的解析中,这时我们所接受的数据是要进行解析,可能用到指针.如果在C中去调用,当然也是可以的.但如果想写的简洁一些,用swift直接去处理这些,是否可以呢.那就要看在swift中是否很好的去使用指针呢. 事实上,swift是支持使用指针的.苹果已经公开了swift

Swift学习笔记十二

方法 方法就是和某种特定类型相关联的函数.类.结构体.枚举都可以定义实例方法和类型方法.类型方法和OC中的类方法类似. 结构体和枚举也可以定义方法是Swift与C/OC之间很大的一个区别,在OC中,只有类才能定义方法. 实例方法 实例方法是从属于某个类实例或结构体实例.枚举实例的方法.他们提供与该实例相关的功能,比如获取更改属性或者提供其他函数功能.实例方法的语法和函数完全相同. 实例方法隐式地可以访问该类型的属性和方法.只能从该类型的实例上调用实例方法.比如: class Counter {

怎样在swift中使用cocoapods导入的第三方oc库

假如你来到这里,说明你已经開始着手使用swift这门新语言了. 就像Java有Maven一样.Objective-C也有自己的依赖管理工具cocoapods. 可是因为swift才出来不久,眼下非常多cocoapods管理的第三方库依旧是由Objective-C编写的. 为了可以在swift中使用这些类库.须要在Xcode中进行一些配置. 如果你的项目是基于cocoapods的,而且是通过XX.xcworkspace打开的.(Xcode6以上) 为了进行演示,如果导入的第三方库是MBProgre

在Swift中实现 oc与swift的混编

在Swift中想要引用OC头文件(import),可采用混编的方法,这里以sqlite为例,采用OC-Swift桥的方式实现添加头文件1引入sqlite数据库的库文件 打开工程配置文件,在build Phases选项标签的第三个选项中添加sqlite3 2.先创建桥文件 command + N键选择创建头文件 写一个名字 将要引入的文件在这个Header桥文件里进行引入就行,即将import 语句写在这里 3 配置桥接文件打开工程配置文件,在build setting选项标签搜索框里输入brid

swiftDay01笔记 --swift和OC的不同点 && swift的基础语法

1.创建对象 带圆括号 * OC:      alloc initWithXXX 方法 * Swift:   (xxx:) //OC : //UIView *view = [UIView alloc]init]; //Swift : let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 2.方法调用   用点 * OC:     [UIColor redColor]; * Swift    UIColor.re

swift中闭包 OC中Block 解决循环引用

OC 中 全局宏定义 #define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self; 用法如下: WS(weakself) [self.tableView addHeaderWithCallback:^{ [weakself requestMemberList]; }]; swift 在比闭包 中使用 weakSelf weak var weakSelf = self demo4 {     // 使用?的好处 就是一旦 self 被释

Swift学习笔记一:与OC的区别

在 Swift 中没有了 main.m,@UIApplicationMain 是程序入口 在 Swift 中只有 .swift 文件,没有 .h/.m 文件的区分 在 Swift 中,一个类就是用一对 {} 括起的,没有 @implementation 和 @end  1. 方法调用  OC      [[UIView alloc] initWithXXX:]  Swift   UIView(XXX: )    UIView() 类名()    ==  alloc / init 2. 类方法  

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

首先呢  把你需要的第三方库导入到你的项目中来  具体怎么导入 这不是这篇的重点  看上一篇 废话不多  直接上 (1)在项目中直接建一个 oc 的控制器  然后xcode会提醒你  要不要建造桥接文件  选择创建就OK了  看下图最下面  是我创建的 (2)确定使用那个桥接头文件 如下图 (3)在桥接文件里  直接这样写  如下图 (4)然后你就可以在你的项目中使用你添加的库了  就是这么简单 下面来看一下 我在swift中使用的AFNetworking 的实例代码  请求的是百度首页的数据

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

一.介绍 随着Swift的逐渐成熟,使用swift开发或者混合开发已经成为了一个趋势,本身苹果公司也十分推荐使用Swift这门新语言.目前Swift已经更新到了3.0,估计没有多久4.0就要出来了.那么再用Swift开发时遇到一些问题不可避免,下面就来解决几个常遇到的问题. 二.问题和解决办法 如何在Swift中手动桥接OC? 1.创建swift桥接文件   2.设置桥接文件路径,也即Objective-C Bridging Header的路径,设置完就可以导入自定义的OC类文件使用了 如何使用