Swift 基础(1) - Tips

一、关键词

guard 使用场景
使用 guard 来表达 “提前退出”的意图,有以下 使用场景 :

在验证入口条件时
在成功路径上提前退出
在可选值解包时(拍扁 if let..else 金字塔)
return 和 throw 中
日志、崩溃和断言中
fileprivate
  • 当前文件都可以使用
  • 比如说在函数前面加上这个关键字,当前文件都可以调用这个函数
private:
  • 当前文件且在一个 extension 才可以使用
filter: 条件满足
  • 用于选择数组元素中满足某种条件的元素
    intArray = [1, 3, 5]
    let filterArr = intArray.filter {
    // $0表示第一个参数、一次类推
    return $0 > 2
    }
    // [3, 5]
map: 转换
  • map 是Array类的一个方法,我们可以使用它来对数组的每个元素进行转换
    let intArray = [1, 3, 5]
    let stringArr = intArray.map {
    return "($0)"
    }
    // ["1", "3", "5"]
reduce: 计算
  • 把数组元素组合计算为一个值
    let intArray = [1, 3, 5]
    let result = intArray.reduce(0) {
    return $0 + $1
    }
    //9
final:
  • 声明该类、函数、属性不可被继承或重写。

二、协议代理

  • 为了避免循环引用, 代理用 weak 修饰, 但是weak 修饰会报错, 因为 weak 只修饰class, 所以协议需要继承自 class
  • struct enum 都可以遵守协议

三、函数

  • 默认参数
func makecoffee(type :String = "卡布奇诺") -> String {
    return "制作一杯\(type)咖啡。"
}

let coffee1 = makecoffee("拿铁")
let coffee2 = makecoffee()
  • 可变参数
func sum(numbers:Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total
}

sum(100.0, 20, 30)
sum(30, 80)
  • 引用类型(指针的传递)
默认情况下,函数的参数是值传递.如果想改变外面的变量,则需要传递变量的地址
必须是变量,因为需要在内部改变其值
Swift提供的inout关键字就可以实现

// 函数二:指针的传递
func swap1(inout a : Int, inout b : Int) {
    let temp = a
    a = b
    b = temp

    print("a:\(a), b:\(b)")
}

swap1(&a, b: &b)
print("a:\(a), b:\(b)")
  • 构造函数
    • 在自定义构造函数调用super.init之前,必须保证所有的属性被初始化,否则报 Property self.titles not initialized... 错误

Extension

  • 在 extension 扩充构造函数,必须扩充便利构造函数
    • 必须在 init 前,加上convenience
    • 必须调用 self.init() 原有的某一个构造函数
      convenience init() {
      self.init()
      }

闭包

  • @escaping : 闭包在另外一个闭包内使用需要用这个关键字

十、其它

class 和 struct 的区别
  • 相同点: 我们可以使用完全使用相同的语法规则来为 class 和 struct 定义属性、方法、下标操作、构造器,也可以通过extension 和 protocol 来提供某种功能。
  • 不同点
    • 与 struct 相比,class 还有如下功能:1、继承允许一个类继承另一个类的特性。2、类型转换允许在运行时检查和解释一个类实例的类型。3、引用计数允许对一个类的多次引用。4、析构器允许一个类实例释放任何其所被分配的资源。
    • 在 swift 中 struct 是值,而 class 是引用。所谓值,struct 一旦生成是不能变的,如果有一个方法改变了自己的属性,这个方法需要标为 mutating,修改时会产生一个新值去替代旧值(这一步可能会被编译器优化,并不一定会真的产生一个新 struct)。而 class 无论怎么传递都是同一个对象。
try? 和 try!是什么意思
  • try?: 表示忽略异常,如果后面的表达式有异常抛出,会忽略,并且返回 nil。
  • try!: 断言这里不会抛异常。如果后面表达式有异常抛出,直接崩溃。
public 和 open 的区别
  • 像构造函数等,只能用 public 不能用 open。enum、protocol 的声明也只能用 public。

你可能感兴趣的:(Swift 基础(1) - Tips)