iOS入门概述
Swift VS Objective-C
编程范式
-
Swift 可以面向协议编程、函数式编程、面向对象编程。
-
Objective-C 以面向对象编程为主,当然也可以引入类似ReactiveCocoa的类库 来进行函数式编程。
类型安全
-
Swift 是一门类型安全的语言。鼓励程序员在代码中清楚明确值的类型。如果代码中使 用一个字符串 String,那么你不能错误地传递一个整型 Int 给它。因为 Swift 是类型安 全的,它会在代码编译的时候做类型检查,并且把所有不匹配的类型作为一个错误标记 出来。这样使得程序员在开发中尽可能早地发现和修正错误。
-
而 Objective-C 则不然,你声明一个 NSString 变量,仍然可以传一个 NSNumber 给 它,尽管编译器会抱怨,但是你仍然可以作为 NSNumber 来使用它。
语言特性
-
Swift 语法更简洁的 class、extension 和 property 定义方式,整个项目中去丢掉了头文件,以及头文件的引入,更加现代化。
-
Objective-C 定义类、方法等更繁琐。
发展及应用
-
Swift从 2014 年至今,已经有 15 个版本发布,其中 5 个大版本,10多 个小版本, 目前5.x版本刚刚基本稳定,第三方库源略少。
-
Swift 于2015 年 12 月 正式开源,目前 Swift 可以应用到多个领域,包括服务端开发及 TensorFlow(基于数据流编程,应用于各类机器学习算法的编程实现) 也有 Swift 语言版本
-
Objective-C 从80年代至今,只有两个版本,发展成熟,三方库源丰富,主要应用于苹果生态应用开发。
抉择
综合多方因素,对于iOS开发入门,选择Swift着手开始更加的友好,也更面向未来,但是要深入精通iOS开发,Objective-C也是必不可少的基础。
Swift 基础简介
变量和常量
-
声明
-
使用关键字 let 来声明常量
-
使用关键字 var 来声明变量
-
可以在一行中声明多个变量或常量,用逗号分隔
-
-
类型标注
-
在声明一个变量或常量的时候提供类型标注,来明确变量或常量能够储存值的类型
-
添加类型标注的方法是在变量或常量的名字后边加一个冒号,再跟一个空格,最后 加上要使用的类型名称
-
可以在一行中定义多个相关的变量为相同的类型,用逗号分隔,只要在最后的变量 名字后边加上类型标注
-
-
变量和常量命名
-
常量和变量的名字几乎可以使用任何字符,甚至包括 Unicode 字符
-
常量和变量的名字不能包含空白字符、数学符号、箭头、保留的(或者无效的) Unicode 码位、连线和制表符。也不能以数字开头,尽管数字几乎可以使用在名字 其他的任何地方
-
-
打印常量和变量
-
print(_:separator:terminator:)
-
字符串插值
-
基本数据类型
-
整数
-
Swift 提供了 8,16,32 和 64 位编码的有符号和无符号整数
-
命名方式:例如 8 位无符号整数的类型是 UInt8 ,32 位有符号整数的类型是 Int32 通过 min 和 max 属性来访问每个整数类型的最小值和最大值
-
Swift 提供了一个额外的整数类型: Int ,它拥有与当前平台的原生字相同的长度 同时 Swift 也提供 UInt 类型,来表示平台长度相关的无符号整数 建议在用到整数的地方都使用 Int
-
-
浮点类型
-
Double:64 位浮点数,至少有 15 位数字的精度
-
Float:32 位浮点数,至少有 6 位数字的精度
-
在两种类型都可以的情况下,推荐使用 Double 类型。
-
-
Bool
- Bool: true 和 false,Swift 的类型安全机制会阻止你用一个非布尔量的值替换掉 Bool
类型别名
-
类型别名是一个为已存在类型定义的一个可选择的名字
-
你可以关键字 typealias 定义一个类型的别名
-
当你想通过在一个在上下文中看起来更合适可具有表达性的名字来引用一个已存在 的类型时,这时别名就非常有用
Tuple元组
-
元组把多个值合并成单一的复合型的值
-
元组内的值可以是任何类型,而且可以不必是同一类型
-
元素命名
-
元组中的每一个元素可以指定对应的元素名称
-
如果没有指定名称的元素也可以使用下标的方式来引用
-
-
Tuple 修改
-
用 var 定义的元组就是可变元组,let 定义的就是不可变元组
-
不管是可变还是不可变元组,元组在创建后就不能增加和删除元素
-
可以对可变元组的元素进行修改,但是不能改变其类型
-
any 类型可以改为任何类型
-
-
Tuple 分解
-
以将一个元组的内容分解成单独的常量或变量
-
如果只需要使用其中的一部分数据,不需要的数据可以用下滑线( _ )代替
-
-
作为函数返回值
-
使用 Tuple 为函数返回多个值
-
返回值的 Tuple 可以在函数的返回类型部分被命名
-
Optional可选值
-
通过在变量类型后面加 ? 表示:
-
这里有一个值,他等于 x 或者
-
这里根本没有值
-
-
你可以通过给可选变量赋值一个 nil 来将之设置为没有值
- 在 Swift 中, nil 不是指针,他是值缺失的一种特殊类型,任何类型的可选项都可以设 置成 nil 而不仅仅是对象类型
-
Optional-If 语句以及强制展开
- 选项是没法直接使用的 需要用!展开之后才能使用(意思是明确知道这个可选项里边有值,需要展开)
-
Optional-强制展开
- 使用 ! 来获取一个不存在的可选值会导致运行错误,在使用!强制展开之前必须确保可选项中 包含一个非 nil 的值。
-
Optional-绑定
-
可以使用可选项绑定来判断可选项是否包含值,如果包含就把值赋给一个临时的常量或者变量
-
可选绑定可以与 if 和 while 的语句使用来检查可选项内部的值,并赋值给一个变量或常量
-
同一个 if 语句中包含多可选项绑定,用逗号分隔即可。如果任一可选绑定结果是 nil 或者布尔 值为 false ,那么整个 if 判断会被看作 false
-
-
Optional-隐式展开
-
有些可选项一旦被设定值之后,就会一直拥有值,在这种情况下,就可以去掉检查的需求, 也不必每次访问的时候都进行展开
-
通过在声明的类型后边添加一个叹号( String! )而非问号( String? ) 来书写隐式展开可 选项
-
隐式展开可选项主要被用在 Swift 类的初始化过程中
-
String字符串
-
初始化
-
字面量:字符串字面量是被双引号(”)包裹的固定顺序文本字符
-
多行字面量:多行字符串字面量是用三个双引号引起来的一系列字符,使用反斜杠( \ )换行
-
初始化器语法
-
isEmpty 检查是否为空串
-
-
字符串里的特殊字符
- 转义特殊字符 \0 (空字符), \ (反斜杠), \t (水平制表符), \n (换行符), \r(回车符), " (双引号) 以及 ‘ (单引号)
-
字符串操作
-
var 指定的可以修改
-
let 指定的不可修改
-
-
操作字符
-
for-in 循环遍历 String 中的每一个独立的 Character
-
String 值可以通过传入 Character 数组来构造
-
-
字符串拼接
-
使用加运算符( +)创建新字符串
-
使用加赋值符号( +=)在已经存在的 String 值末尾追加一个 String 值
-
使用 String 类型的 append() 方法来可以给一个 String 变量的末尾追加 Character 值
-
-
字符串插值
-
字符串插值是一种从混合常量、变量、字面量和表达式的字符串字面量构造新 String 值的方法
-
每一个你插入到字符串字面量的元素都要被一对圆括号包裹,然后使用反斜杠前缀
-
-
字符串索引
-
每一个 String 值都有相关的索引类型, String.Index,它相当于每个 Character 在字符串中的位置
-
startIndex 属性来访问 String 中第一个 Character 的位置。
-
endIndex 属性就是 String中最后一个 字符后的位置
-
如果 String 为空,则 startIndex 与 endIndex 相等
-
不能直接通过下标随机访问字符串数组的用法,String的下标方法,根本不支持Int类型的下标
-
使用 index(before:) 和 index(after:) 方法来访问给定索引的前后
-
要访问给定索引更远的索引,你可以使用 index(_:offsetBy:)
-
使用 indices 属性来访问字符串中每个字符的索引
-
-
插入
-
插入字符,使用 insert(_: at :) 方法
-
插入另一个字符串的内容到特定的索引,使用 insert(contentsOf:at:) 方法
-
-
删除
-
移除字符,使用 remove(at:)方法
-
移除一小段特定范围的字符串,使用 removeSubrange(_:) 方法
-
-
字符串比较
-
字符串和字符相等性(==和!=)
-
前缀相等性 hasPrefix(_:)
-
后缀相等性 hasSuffix(_:)
-