在了解swift之前我们需要知道OC和swift的区别Swift和OC的区别1. swift中函数为一等公民可以作为参数或者返回值传递同时面向协议编程而OC面向对象编程函数需要用selector封装或者闭包实现2. swift是类型安全的当编译的时候会进行类型检查如果出现问题会标注出来OC则不会进行报错3. swift中很多数据类型都是值类型的比如Arraydictionary而OC中很多都是指针类型如NSDictionary4. swift的枚举可以使用很多类型如整形字符串甚至支持泛型协议扩展等而OC的枚举就相差很多5. swift是支持泛型的6. swift对协议的支持更加丰富且可用于结构体和枚举OC的协议缺乏强约束且optional的关键字使得协议更加混乱Swift中的数值类型在swift中我们使用var来定义变量使用let来定义常量同时我们使用: 数据类型来标识当前的变量类型我们可以使用print来打印变量的值var wjm: Int 1 print(wjm \(wjm))整数swift提供了8163264位有符号和无符号整数浮点数Double 64位float 32位Bool true或者false元组 tuple元组是 Swift 中一种轻量级的复合数据类型核心作用是把多个不同类型或相同类型的值打包成一个单一的集合无需定义专门的结构体 / 类就能临时组合数据。长度固定创建后不能动态添加 / 删除元素支持命名元素和下标访问取值灵活使用元组可以为函数返回多个值且返回的值在元组中也可以被命名可选类型 optional在swift中nil不是指针而是一种数值缺失的特殊类型任何类型的可选项都可以设置为nil我们通过使用变量类型后 来表示这个变量是可选类型note可选类型是无法直接使用的其可以通过展开之后进行使用但是需要注意的是我们在工作中几乎不会使用而是通过(?: ??)可选链或者if let (可选绑定)来进行展开if let称为可选项绑定一个语句中可以使用多次用逗号隔开var name: String? wjm var number: int? 1006 if let name name, number number { code }?: 或者?? 称为可选链实际上optional是标准库中的一个枚举 范型其中的none代表的就是nilsome就是包装的类型同时在init中将该属性进行包装然后在使用的时候进行展开即可获取字符串 String初始化字符串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,51..5 1,2,3,41..5 2.3.4.5[..5] -∞ .. 4note:区间运算符也可以使用在字符串中运算符重载在swift中struct和class都是可以为现有的运算符提供自定义的实现如果实现前缀或者后缀运算符的实现需要在func关键字之前指定prefix或者postfix如果是组合运算符需要将运算符的左参数设置为inout类型如果是等价运算符需要实现Equatable协议自定义运算符我们使用operator关键字进行运算符的定义和声明自定义运算符新的运算符需要作用在全局范围内循环控制1. 使用for in来进行遍历比如一个范围内的数字数组中的元素或者字符串中的字符当遍历字典的时候其会返回一个元组如果不需要序列中的值可以直接使用下划线来代替while循环和OC大体上保持一致需要注意的是OC中的do while 在swift中repeat while更加强大的switch语句在swift中其switch不会贯穿匹配不需要类似于OC来添加break在执行完第一个case后其就会推出如果需要匹配多个值需要使用逗号分隔同时还可以使用区间运算符其支持区间匹配可以使用元组来测试多个值_代表任意值switch case 可以使用where分句来检查条件控制转移continue 跳过当前循环break结束当前控制流fallthrouth 使的switch语句获得像OC一样的特性return一般作为函数返回使用throw抛出errorguardguard语句只有为真的时候才能继续向下执行函数其总是存在一个else分支如果guard语句为假执行这个分支guard wjmIsHunsum else {}函数swift中的每一个函数都有类型由函数的形式参数类型和返回类型组成你可以像swift中其余类型那样使用他func myFunc(name: String) - String { return hello world }可以传入多个参数用逗号分隔如果你想返回多个值可以使用元组在swift中可以指定实际参数标签在形式参数名之前写实际参数名称用空格分隔如果不想使用实际函数标签可以使用_来表示省略如果定义了默认值你可以在调用的时候省略这个参数可变形式参数只可以在函数内部改变如果想影响到函数外部可以使用inout关键字在调用的时候需要在参数前 函数类型每一个函数都有其特定函数类型它是由形式参数函数类型返回类型组成比如(Int, Int) - Int你可以像使用swift中的其余类型一样来使用函数类型比如可以作为形式参数可以作为返回值同时我们还可以在一个函数内部定义另外一个函数称为内嵌函数闭包和闭包表达式全局函数和内嵌函数实际上就是特殊的闭包闭包符合下面三种函数的一种1. 全局函数是一个有名字但是不会捕获任意值的闭包2. 内嵌函数是一个有名字且能从上层函数捕获值的闭包3. 闭包表达式是一种轻量级别的语法所写的可以捕获其上下文常量或者变量值没有名字的闭包闭包表达式{ (parameters) - (return type) in statements }单表达式闭包能勾从它们的声明中删除return关键字甚至你可以省略类型让swift帮你做类型推断但是在实际开发中我们应该尽量将代码写完整swift中自动对内提供简写实际参数名称可以通过$0 $1 $2来代替如果你需要一个很长的闭包表达式作为函数的最后一个参数我们可以使用尾随闭包可以将最后一个参数提取出来 使用{ } 来包裹函数体闭包捕获值一个闭包可以从上下文中捕获已经定义的常量或者变量即使已经离开了原作用域但是闭包内依旧可以使用强引用捕获同时如果闭包捕获的值没有发生改变实际上使用的拷贝不是捕获如果你分配了一个闭包给类实例的属性并且闭包通过引用该实例或者他的成员来捕获实力就会产生循环引用逃逸闭包和自动闭包当闭包作为一个实际参数传递给一个函数的时候并且会在函数返回后调用我们称这个闭包逃逸了需要在其形式参数前 escaping来表示如果闭包逃逸你需要显式的引用self自动闭包是一种自动创建的用来把作为实际参数传递给函数的表达式进行打包当其被调用的时候返回内部打包的表达式的值public func assert(_ condition: autocloure () - Bool) { print(\(condition)) }