ios学习路线 -- Swift基础(1)

在了解swift之前,我们需要知道OC和swift的区别

Swift和OC的区别

  1. swift中函数为一等公民,可以作为参数或者返回值传递,同时面向协议编程,而OC面向对象编程,函数需要用selector封装或者闭包实现

  2. swift是类型安全的,当编译的时候会进行类型检查,如果出现问题会标注出来,OC则不会进行报错

  3. swift中很多数据类型都是值类型的,比如Array,dictionary,而OC中很多都是指针类型,如NSDictionary

  4. swift的枚举可以使用很多类型,如整形,字符串,甚至支持泛型,协议,扩展等,而OC的枚举就相差很多

  5. swift是支持泛型的

  6. swift对协议的支持更加丰富,且可用于结构体和枚举,OC的协议缺乏强约束,且optional的关键字使得协议更加混乱

Swift中的数值类型

在swift中,我们使用var来定义变量,使用let来定义常量,同时我们使用: + 数据类型来标识当前的变量类型

我们可以使用print来打印变量的值

复制代码
var wjm: Int = 1
print("wjm = \(wjm)")

整数:swift提供了8,16,32,64位有符号和无符号整数

浮点数:Double 64位,float 32位

Bool: true或者false

元组 tuple

元组是 Swift 中一种轻量级的复合数据类型,核心作用是把多个不同类型(或相同类型)的值打包成一个单一的集合,无需定义专门的结构体 / 类就能临时组合数据。

长度固定(创建后不能动态添加 / 删除元素);

支持命名元素下标访问,取值灵活;

使用元组可以为函数返回多个值,且返回的值在元组中也可以被命名

可选类型 optional

在swift中,nil不是指针,而是一种数值缺失的特殊类型,任何类型的可选项都可以设置为nil

我们通过使用变量类型后+ ?来表示这个变量是可选类型

note:可选类型是无法直接使用的,其可以通过!展开之后进行使用

但是需要注意的是,我们在工作中几乎不会使用!而是通过(?: ??)(可选链)或者if let (可选绑定)来进行展开

if let称为可选项绑定,一个语句中可以使用多次,用逗号隔开

Swift 复制代码
var name: String? = "wjm"
var number: int? = 1006

if let name = name, number = number {
    code
}

?: 或者?? 称为可选链

实际上optional是标准库中的一个枚举 + 范型

其中的none代表的就是nil,some就是包装的类型

同时在init中

将该属性进行包装

然后在使用的时候进行展开即可获取

字符串 String

初始化字符串

Swift 复制代码
var str = ""
var str = "wjm"

使用isEmpty来检查是否为空串

Swift字符串常用操作

String的传递实际上是复制操作

for in操作可以用来遍历字符串,且每一个字符为一个独立的character

字符串拼接使用 + +=或者append()

索引:每个String都有对应的索引类型,String.index相当于character在String的位置

我们不可以像其他语言那样使用[Int]来访问

访问方式为使用索引,同时通过index before || end来进行遍历

通过insert at来插入字符

区间运算符

1...5 = 1,2,3,4,5

1..<5 = 1,2,3,4

1<..5 = 2.3.4.5

..\<5\] = -∞ .. 4 note:区间运算符也可以使用在字符串中 ### 运算符重载 在swift中,struct和class都是可以为现有的运算符提供自定义的实现 如果实现前缀或者后缀运算符的实现,需要在func关键字之前指定prefix或者postfix ![](https://i-blog.csdnimg.cn/direct/a3d1f869a9814d2799ad512a3f5328f1.png) 如果是组合运算符,需要将运算符的左参数设置为inout类型 ![](https://i-blog.csdnimg.cn/direct/7bcf94216e5e4f84a419f19ba3c03cf0.png) 如果是等价运算符,需要实现Equatable协议 ### 自定义运算符 我们使用operator关键字进行运算符的定义和声明自定义运算符,新的运算符需要作用在全局范围内 ![](https://i-blog.csdnimg.cn/direct/d5112fde3a544dce9fe231404a48124d.png) ## 循环控制 1. 使用for in来进行遍历,比如一个范围内的数字,数组中的元素或者字符串中的字符 当遍历字典的时候,其会返回一个元组 如果不需要序列中的值,可以直接使用下划线来代替 ![](https://i-blog.csdnimg.cn/direct/f98b6d34f3df419dad2e9ca492196ac2.png) while循环和OC大体上保持一致 需要注意的是OC中的do while 在swift中repeat while ## 更加强大的switch语句 在swift中,其switch不会贯穿匹配,不需要类似于OC来添加break,在执行完第一个case后其就会推出,如果需要匹配多个值,需要使用逗号分隔,同时还可以使用区间运算符,其支持区间匹配 可以使用元组来测试多个值,_代表任意值 switch case 可以使用where分句来检查条件 ## 控制转移 continue: 跳过当前循环 break:结束当前控制流 fallthrouth : 使的switch语句获得像OC一样的特性 return:一般作为函数返回使用 throw:抛出error ## guard guard语句只有为真的时候才能继续向下执行函数,其总是存在一个else分支,如果guard语句为假,执行这个分支 guard wjmIsHunsum else {} ## 函数 swift中的每一个函数都有类型,由函数的形式参数类型和返回类型组成,你可以像swift中其余类型那样使用他 func myFunc(name: String) -> String { return "hello world" } 可以传入多个参数,用逗号分隔 如果你想返回多个值,可以使用元组 在swift中,可以指定实际参数标签,在形式参数名之前写实际参数名称,用空格分隔 如果不想使用实际函数标签,可以使用_来表示省略 如果定义了默认值,你可以在调用的时候省略这个参数 可变形式参数只可以在函数内部改变,如果想影响到函数外部,可以使用inout关键字 在调用的时候需要在参数前 + \& ### 函数类型 每一个函数都有其特定函数类型,它是由形式参数函数类型,返回类型组成 比如:(Int, Int) -\> Int 你可以像使用swift中的其余类型一样来使用函数类型 比如,可以作为形式参数,可以作为返回值 同时我们还可以在一个函数内部定义另外一个函数,称为内嵌函数 ### 闭包和闭包表达式 全局函数和内嵌函数实际上就是特殊的闭包 闭包符合下面三种函数的一种 1. 全局函数是一个有名字但是不会捕获任意值的闭包 2. 内嵌函数是一个有名字且能从上层函数捕获值的闭包 3. 闭包表达式是一种轻量级别的语法所写的可以捕获其上下文常量或者变量值没有名字的闭包 闭包表达式 ```Swift { (parameters) -> (return type) in statements } ``` 单表达式闭包能勾从它们的声明中删除return关键字,甚至你可以省略类型,让swift帮你做类型推断 但是在实际开发中,我们应该尽量将代码写完整 swift中自动对内提供简写实际参数名称,可以通过$0 $1 $2来代替 如果你需要一个很长的闭包表达式作为函数的最后一个参数,我们可以使用尾随闭包,可以将最后一个参数提取出来 使用{ } 来包裹函数体 #### 闭包捕获值 一个闭包可以从上下文中捕获已经定义的常量或者变量,即使已经离开了原作用域,但是闭包内依旧可以使用(强引用捕获) 同时,如果闭包捕获的值没有发生改变,实际上使用的拷贝,不是捕获 如果你分配了一个闭包给类实例的属性,并且闭包通过引用该实例或者他的成员来捕获实力,就会产生循环引用 ### 逃逸闭包和自动闭包 当闭包作为一个实际参数传递给一个函数的时候,并且会在函数返回后调用,我们称这个闭包逃逸了,需要在其形式参数前+ @escaping来表示 如果闭包逃逸,你需要显式的引用self 自动闭包是一种自动创建的用来把作为实际参数传递给函数的表达式进行打包,当其被调用的时候,返回内部打包的表达式的值 ```Swift public func assert(_ condition: @autocloure () -> Bool) { print("\(condition)") } ```

相关推荐
Vect__2 小时前
深刻理解C++STL库常见容器功能和底层
开发语言·c++
夏玉林的学习之路2 小时前
委托构造和using关键字
开发语言·c++·算法
jiang_changsheng2 小时前
VMware 虚拟机无法上网排查解决教程
开发语言·网络·php
00后程序员张2 小时前
iOS 应用的 HTTPS 连接端口在网络抓包调试中有什么作用
android·网络·ios·小程序·https·uni-app·iphone
阿成学长_Cain2 小时前
Windows IP 配置查看器 ipconfig 详解
开发语言·php
Yupureki2 小时前
《C++实战项目-高并发内存池》2.ObjectPool构造
linux·服务器·c语言·开发语言·jvm·c++
XiYang-DING2 小时前
【Java SE】Java中的static关键字总结
java·开发语言
格林威2 小时前
工业相机图像高速存储(C++版):内存映射文件(MMF)零拷贝方案,附堡盟 (Baumer) 相机实战代码!
开发语言·c++·人工智能·数码相机·计算机视觉·视觉检测·工业相机
沐知全栈开发2 小时前
正则表达式入门教程
开发语言