Swift语法篇

815 阅读5分钟

Why Swift?

It's safer, faster, easier.

Swift 与 C/Objective-C 的主要区别

  1. 结构体和枚举能够定义方法是 Swift 与 C/Objective-C 的主要区别之一。
  2. 在 Objective-C 中,类是唯一能定义方法的类型。但在 Swift 中,你不仅能选择是否要定义一个类/结构体/枚举,还能灵活地在你创建的类型(类/结构体/枚举)上定义方法。
  3. OC中类方法只能在类中定义,在Swift中可以为所有的类、结构体和枚举定义,每个类方法都被显示包含.
  4. Swift中的Dictionary类型的下标接受并返回可选类型的值,之所以是可选Int?因为不是每一个key键都会有value值,同时给我们也提供了通过key键删除值得方法。
  5. 在Swift中,继承是区分[类]和其他类型的一个基本特征。注意:Swift中的类不是从一个通用的基类继承而来,如果你不为自定义的类指定超类的话,这个类就自动成为基类。

1、guard 和 if的区别

    guard和if一样都是基于表达式的布尔值判断,不同的是
    guard只有在条件不满足时执行else代码
    guard避免条件语句嵌套,可读性更强
    对不期望的情况早做检查,使函数更加易读 容易维护。

2、for in 和 for each的区别? foreach如何获取索引值?

Using the `forEach` method is distinct from a `for`-`in` loop in two important ways:
 1. You cannot use a `break` or `continue` statement to exit the current
   call of the `body` closure or skip subsequent calls.
 2. Using the `return` statement in the `body` closure will exit only from
    the current call to `body`, not from any outer scope, and won't skip
   subsequent calls.
使用enumerated()方法 例如:
Array.enumerated().forEach { (offset, element) in 
………………//offset就是下标 element是数组内对象
}
另外map、filter等方法也同样适用 
还可以结合reversed()等方法灵活运用

3 inout 参数

使用inout关键字修饰形参,可以达到参数值引用得目的。

4.OOP编程的三个最大的缺陷是什么?

动态派发安全性
横切关注点
菱形缺陷

5.为什么用协议和协议扩展?

协议:

1. 提供实现的入口
2. 遵循协议的类型需要对其进行实现

扩展:

1. 为入口提供默认实现
2. 根据入口提供额外实现

✅ 使用协议解决动态派发安全性
✅ 使用协议扩展解决横切关注点

6. Swift中的循环引用如何解决?

1.仿照OC里用weakSelf解决, weak var weakSelf = self; 2.[weak self] 中self为可选类型,可以是nil,所以必须self解包 3.[unowned self] 在使用前保证必须有这个对象,所以不用解包。

7. 闭包和逃逸闭包的区别

1.闭包的函数体部分由关键字 in 引入。该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。

2.当一个闭包作为函数的参数并且在函数返回后闭包才被执行,我们说闭包从函数中逃逸。

在参数前用@escaping 来修饰参数。

很多启动异步操作的函数接受一个闭包参数作为 completion handler。这类函数会在异步操作开始之后立刻返回,但是闭包直到异步操作结束后才会被调用。

8. struct VS class

Swift中结构体和类有很多共同点:
定义属性用于存储值
定义方法用于提供功能
定义下标操作用于通过下标语法访问它们的值
定义构造器用于设置初始值
通过扩展以增加默认实现之外的功能
遵循协议以提供某种标准功能

与结构体相比,类还有如下的附加功能:

允许一个类继承另一个类的特征
类型转换允许在运行时检查和解释一个类实例的类型
析构器允许一个类实例释放任何其所被分配的资源
引用计数允许对一个类的多次引用

更多信息请参见 继承、类型转换、析构过程 和 自动引用计数。 类支持的附加功能是以增加复杂性为代价的。作为一般准则,优先使用结构体,因为它们更容易理解,仅在适当或必要时才使用类。实际上,这意味着你的大多数自定义数据类型都会是结构体和枚举。

结构体和枚举是值类型
值类型是这样一种类型,当它被赋值给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝。

实际上,Swift 中所有的基本类型:整数(integer)、浮点数(floating-point number)、布尔值(boolean)、字符串(string)、数组(array)和字典(dictionary),都是值类型,其底层也是使用结构体实现的。

Swift 中所有的结构体和枚举类型都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型的属性,在代码中传递的时候都会被复制。

类是引用类型
与值类型不同,引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。

因此,使用的是已存在实例的引用,而不是其拷贝。

请注意,“相同”(用三个等号表示,===)与“等于”(用两个等号表示,==)的不同。
“相同”表示两个类类型(class type)的常量或者变量引用同一个类实例。
“等于”表示两个实例的值“相等”或“等价”

9.可选元组解决函数返回值空数组问题

   func minMax(array: [Int]) -> (min: Int, max: Int)? {
        if array.isEmpty { return nil}
        var minValue = array[0]
        var maxValue = array[0]
        for value in array[1..<array.count] {
            if minValue < value {
                minValue = value
            }else if value > maxValue{
                maxValue = value
            }
        }
        return (minValue,maxValue)
    }

10.inout解决函数输入输出参数在函数体可变

func swapNumber(_ a:  inout Int, _ b: inout Int) {
    let  temp = a
    a = b
    b = temp
}

持续更新中... 更新日期:2019-06-19