swiftDay01笔记 --swift和OC的不同点 && swift的基础语法(一)
1.创建对象 带圆括号
* OC: alloc initWithXXX 方法
* Swift: (xxx:)
//OC :
//UIView *view = [UIView alloc]init];
//Swift :
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
2.方法调用 用点
* OC: [UIColor redColor];
* Swift UIColor.redColor()
3.枚举不一样,一个是以枚举的常量开头合成一个单词,一个是枚举的常量点后面的部分。
* OC: UIButtonTypeContactAdd
* Swift: UIButtonType.ContactAdd (button 的加号状态)
4.注释
* OC:
* Swift: 多行注释可以嵌套。
5.Bool类型
* C语言和OC并没有真正的Bool类型
* OC语言的Bool类型YES/NO是`typedef signed char BOOL;`非0即真
Swift引入了真正的Bool类型true/false
* Swift中没有C和OC中非零即真的概念
* Swfit中逻辑值只有两个true/false
* 如果你在需要使用Bool类型的地方使用了非布尔值,Swift 的类型安全机制会报错
swift语言新特性:
5.常量与变量
let
var
6.类型推断
7.类型安全(不能自动隐式转换(数据类型)(如int自动转换为double))
8.命名(除了数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符也不能以数字开头,但是可以在常量与变量名的其他地方包含数字以外,包括 Unicode 字符如🐱🐶等)
9.元组(作为函数返回值时非常有用,取出元组值三种方式:1.下标2.指定元素名称3.分解元素)
10.流程控制结构(if/switch/for/while/dowhile) 许多注意点:
10.1 分支:
* if:只能以Bool作为条件语句,条件语句不需要加(),{}不能省略,Swift中if分支的模式可以使用where语句来判断额外的条件,其它和OCif一样
* 三目运算符:Swift中三目运算符用得很多
* 分支Switch:fallthrough(不会自动贯穿要贯穿必须用这个),OC中可以不写default,Swift中只有满足所有条件才能忽略default,OC中default位置可以随便放,Swift不可以,OC中在case中定义变量需要加大括号, 否则作用域混乱, Swift不用加大括号,Swift中的switch可以判断区间和元祖,Swift中case 分支的模式可以使用where语句来判断额外的条件(像if),Swift中每一个 case 分支都必须包含至少一条语句, 不像 C 语言里的switch语句,在 Swift 中,switch语句不会同时匹配多个条件
*
10.2 循环
* for循环-传统:for后的圆括号可以省略,只能以bool作为条件语句,如果只有一条指令for后面的大括号`不可以`省略,for后面的三个参数都可以省略, 如果省略循环保持语句, 那么默认为真
* for循环-Swift
闭区间: 包含区间内所有值 a...b 例如: 1...5
半闭区间: 包含头不包含尾 a..<b 例如: 1..<5
其它写法
Swift1.0版本写法 0..10
for i in 0..<10 {
print(i)
}
11.可选类型
Swift中只有可选类型才可以赋值为nil。
可选类型的取值是一个枚举( None 没有值, Some 有值)
*可选类型不能直接取出里面的值使用,需要解析出来,解析方法有:
*如果能确定一定有值的,通过 强制解包
*不能确定一定有值的就使用可选绑定(通过判断是不是有值,如果有值就使用否则return)
*当要使用的可选类型很多的时候,使用可选绑定写起来麻烦,使用 guard 它也是可选绑定的实现
*Swift经常使用可选类型,所以系统做了一个语法糖?:定义一个可选类型 number,原本的写法:
var number: Optional<Int>
number = 10
number = nil
语法糖:
var hmn: Int?
hmn = 2
hmn = nil
var number1: Int // (不使用可选类型不能给变量赋值nil)
number1 = 10
//number1 = nil
*隐式解析
/*
隐式解析可选类型(implicitly unwrapped optionals)
* 有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型_总会_有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值
* 隐式解析可选类型, 并不需要每次都使用解析来获取可选值, 一个隐式解析可选类型其实就是一个普通类型,但是可以被当做非可选类型来使用
* 格式: 将可选类型后面的?改为!
* let xmgButton: UIButton! (定义一个UIButton类型的变量xmgButton,它是一旦赋值就永远不为空的可选类型 可以直接把?给为!就是隐式解析)
注意:
* 如果一个变量之后可能变成nil的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型
*/
//不使用隐式解析:(要写这么多(这里通过可选绑定,当然也可以用guard))
let intValue: Int?
intValue = 10
print(intValue)
print(intValue!)
if intValue != nil {
print(intValue!)
}
if let temp = intValue {
print(temp)
}
//使用隐式解析
var doubleValue: Double! //使用隐式解析 要保证doubleValue初始化后不再会为空了 如果还置为nil那么会报错,因为隐式解析是你告诉系统这个变量有值后不会再为空可以被系统自动解析出来。
doubleValue = nil
doubleValue = 3.14
print(doubleValue)
12.数组
12.1 可变不可变:swift中可变不可变数组都是array 看它可不可变看声明是let还是var
12.2 初始化再赋值,初始化同时赋值
12.3 遍历1遍历2、添加、删除、合并(通过区间拼接到想要的地方,通过元组拿到下标(索引)这个索引可以随便写)数组按照2的倍数来分配存储空间
//通过enumeration取得到数组的下标(索引,可以随便写)
for (xxx, ooo) in arr5.enumerate() {
print(xxx) //下标
print(ooo) //最后一个的值
}
//数组如何分配存储空间, 按照2的倍数来分配
var arr9 = [Int]() //快速创建空数组
arr9.capacity //打印数组容量
arr9.append(10)
arr9.capacity
arr9.append(11)
arr9.capacity
arr9.append(12)
arr9.capacity
arr9.append(13)
arr9.capacity
arr9.append(15)
arr9.capacity
13.数组
(类似数组)
*let 不可变字典,var 可变字典
*声明字典,初始化字典,定义空字典
*定义有值的字典
*[String : NSObject] 类型是做iOS开发中最最常见的类型
*获取字典值
*增加( 只要字典中没有对应的key就会新增)
14.字符串
*OC语言中的字符串也是以\0结尾, Swift不是
* OC中字符串是一个对象, Swift中使用String是一个结构体,效率更高, 支持遍历
*值类型。 如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。 任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作
操作1:拼接
操作2:插值
操作3:格式化
操作4:截取
let str3 = "com.520it.xmg"
// 截取xmg
// 注意: Swift中截取字符串的方法, 接收的参数和OC中不一样
// 前期, 为了大家开发方便, 建议转换为NSString之后再截取
// 转换
let str4 = str3 as NSString
let result2 = str4.substringFromIndex(10)
//Swift字符串中的 .startIndex ,用于获取字符串中第一个字符的位置
//Swift字符串中的 .endIndex, 用于获取字符串中最后一个字符串`下一位`的位置
let result3 = str3.substringFromIndex(str3.endIndex.advancedBy(-3))
let result4 = str3.substringFromIndex(str3.startIndex.advancedBy(10))