swift基础至高级知识点(代码形式展现)与标准源码外加(项目实战)

321 阅读2分钟

1.三目运算符questiion?answer1: answer21. 普通 `1. var a = 13

  1. var b = 14

  2. if a<b{

  3. printf("a小于b")

  4. }

  5. else{

  6. printf("a大于或等于b")

  7. }`

  8. 三目 `1. var c = a<b?a:b复制代码2.控制流1. ## 循环结构 ##

  9. 【1】for in

  10. for a in 0...99{

  11. a*2

  12. }

  13. 局限性:只能在区间中遍历,全都是是整型并且只可以一个数一个数的遍历。

  14. 【2】for

  15. for i=0;i<10;i++ {

  16. i=i+1

  17. }`

  18. 注意:for循环可以不打小括号,循环体内只有有一句话也要打大括号,i可为小数。

  19. 【3】repeat-while//至少要执行一次复制代码3.Switch高级用法1. ##switch不仅可以判断单值,也可以判断区间,也可以判断元祖##

  20. let score = 80//判断区间

  21. switch score {

  22. case 0..<70:

  23. printf("良好")

  24. case 71..<100:

  25. printf("优秀")

  26. default:

  27. printf("错误")

  28. } |`` |

源码

会经常看到目录:

docs:一些文档

stdlib:swift源码

lib:c++源码

include:c++头文件

1 Array的分析

① map

屏幕截图 2021-08-11 140548.png

② flatMap

屏幕截图 2021-08-11 140656.png

屏幕截图 2021-08-11 143306.png

③ filter

屏幕截图 2021-08-11 142941.png

④ reduce

屏幕截图 2021-08-11 143043.png

⑤ compactMap

[最新资料](点击 docs.qq.com/doc/DZXpKSU…)

屏幕截图 2021-08-11 143130.png

Optional分析

① map、flatMap

屏幕截图 2021-08-11 143306.png

② 等价运算符 ==

可以参考上方的高级运算符

extension Optional where Wrapped: Equatable {
    //左边为nil右边为可选类型会进入这里
    public static func ==(lhs: _OptionalNilComparisonType, rhs: Wrapped?) -> Bool {
        switch rhs {
        case .some:
            return false
        case .none:
            return true
        }
    }
    //左边为可选类型右边为nil会进入这里
    public static func ==(lhs: Wrapped?, rhs: _OptionalNilComparisonType) -> Bool {
        switch lhs {
        case .some:
            return false
        case .none:
            return true
        }
    }
    //左右都为可选类型会进入这里(如果有非可选的会被包装成可选的,如:Int->Int?)
    //如果两个都为可选类型,进入这个方法的时候会把两个参数包装成?多的那个
    public static func ==(lhs: Wrapped?, rhs: Wrapped?) -> Bool {
        switch (lhs, rhs) {
        case let (l?, r?): //左右都不为nil 解包,将解包后的值赋值给l和r
            return l == r //l和r相等就返回true
        case (nil, nil): //左右都为nil
            return true
        default: //其他情况
            return false
        }
    }
}

var age1: Int???? = 20
var age2: Int = 20
print(age1 == age2) //true 都会包装成Int????

var age3: Int? = nil
var age4: Int??? = age3
var age5: Int??? = nil
print(age4 == age5) //false age4和age5不一样,age5盒子里就一个nil,age4盒子里不为nil,装了个age3,age3里面才是nil,所以他们不相等

var age6: Int??? = nil
var age7: Int? = nil
print(age6 == age7) //false 这时候比较的时候会进入default,一个为nil一个不为nil,换个思路,类型不一样肯定不相等啊

项目实战

常用swift第三方库

网络请求

图片下载

JSON访问

JSON-Model转换

Alamofire的request方法可以直接使用,不像以前需要创建实例,这是为什么呢?
因为request是public的,其他模块也可以使用。

如果自己也有request方法,想要使用Alamofire的request方法,就直接Alamofire.request就可以了,所以现在好多第三方库的方法都是直接public的,也不怕重名。

Kingfisher注意事项:

Kingfisher默认不支持webp格式的图片, 需要额外安装KingfisherWebP

pod 'KingfisherWebP'
iconView.kf.setImage(with: URL(string: user.thumb),
                     options: [.processor(WebPProcessor.default), .cacheSerializer(WebPSerializer.default)])

接下来就是库的导入问题了:

默认情况下,用到哪个库就导入哪个库,这样会增加很多重复的工作量,那怎么样做到全局导入库呢? 新建一个用于swift调用oc桥接文件:targetName-Bridging-Header.h

  • 导入系统库:#import <XX/XX.h>
  • 导入第三方库(Framework形式):#import <XX/XX-Swift.h>

请多多关注

这是我在哔哩哔哩发的swift闭包的学习视频地址

[iOS逻辑沐沐的个人空间_哔哩哔哩_Bilibili](url)(这是一些进阶的视频,不好请勿喷)

iOS沐辰君的个人空间_哔哩哔哩_Bilibili https://space.bilibili.com/1237846717 (这是些基础的,一些flutter底层的)