2015-11-05
Swift代码
开发技巧:
- 自动类型推导: option + click 查看变量/方法的说明
- 能不写类型就不写类型,减少冗余代码
- 苹果推荐我们先定义常量,只有需要修改的时候才定义变量
数据类型:
- 类型安全的语言,在任何情况下都不会进行自动类型转换(隐式类型转换),所有的转换都必须是显示的
- 只有相同类型的值才能进行赋值
- 哪怕是CGFloat和Double之间也必须进行转换
// 常量 let let number: Int number = 10 let a = 10 //自动类型推导 option + click 查看变量/方法的说明 // 变量 var var value: Double value = 20
元祖
- 可以将多个值保存在一起
- 元祖可以保存不同数据类型的值
- 元祖和数组一样,可以通过索引访问元祖中保存的值,除此之外,还可以给每一个值起一个名字,将来通过这个名字来访问对应的值,还能在定义的同时取出元祖中的值
let number = (10, 11, 12) //通过索引访问 number.0 // 10 number.1 // 11 number.2 // 12
let person = (name: "gm", age: 30,score: 100) // 通过名称访问 person.name person.age person.score
let values: (String, Int, Double) = ("gm",30,99.9) let (name, age, score) = ("gm",30,99.9) name age score
if
- 必须是bool值,取值true/false
- 条件表达式中的()可以省略
- {}不允许省略,哪怕只有一条语句
if num == 10 { print("值为10") }
三目运算符
- 用法和OC中一模一样,除了条件表达式只能是bool类型之外
- 开发中三目运算符用的非常多
let value = 10 let res = value == 20 ? 20 : 0
switch
- 用法大致和OC中一样
- 条件表达式()可以省略
- break可以省略,不会穿透
- OC 中如果想在case中定义变量,必须加上{},否则作用域混乱,而Swift不用
- OC中default的位置可以随便乱写,会先判断完所有的case才会执行default,swift中不能随便乱写,只能写在最后
- OC中default是可以省略的,swift default大部分是不可以省略的
let number = 0 switch number { case 0: print("0") case 5: print("5") case 10: print("10")
default:
print("default")
}
可选类型
- 在OC中可以给一个对象类型变量赋值为nil或者一个对象,而在Swift中如果想给一个变量赋值为nil那么必须明确指定为可选类型才可以,也就是说普通类型是不能赋值为nil
- 如果以后但凡看到init后面跟上一个?,酒店代表初始化方法返回的值是可选的
- 可选类型不能直接使用,如果要使用可选类型的值,就必须对可选类型进行解包
- 解包: 告诉系统可选类型的变量,一定有值,乳沟可选类型的值没有值,我们又进行强制解包,那么会报错
- 解包的方式: 加!
let str = "http://aunty.com/" let url = NSURL(string: str) print(url!) //解包 let num1: Int? = 10 let num2: Int =20 let sum = num1! + num2 //不推荐我们随便使用强制解包
if let temp = num1 //可选绑定 { let sum = temp + num2 }
可选绑定
- 专门用于解决强制解包的弊端
- 开发中如果想使用一个可选类型的值,也不一定一定选用可选绑定,因为如果可选类型的值较多,而又属于同一个逻辑,那么一不小心就会形成if嵌套
let url2 = NSURL(string: str) print(url2) if let temp = url2 { print(abc) } let v1: Int? = 10 let va: Int? = 20 if let m =v1 { if let n = v2 { let sum = n1 + n2 } }
guard
- 类似于可选绑定,swift2.0推出
- 只有条件为假才会执行else后面大括号中的代码
func test() { guard let m = v1 else { print("没有值") return } guard let n = v2 else { print("没有值") return } let _ = m + n } test()
for循环
- 基本用法和OC一样
- 条件表达式必须是bool类型的值
- 条件表达式中的() 可以省略
- {} 不可以省略
for var i = 0; i < 10; i++ { print(i) }
区间
- 半闭区间: 0..<10 包含头不包含尾
- 闭区间: 0...10 包含头也包含尾
for i in 0..<10 { print(i) }
while 循环
- 基本用法和OC一致
- 条件表达式必须是bool类型的值
- 条件表达式的()可以省略
- 在OC中如果{}中只有一条语句,那么{}可以省略,而Swift不可以
var value = 0 repeat{ print(value) value++ }while value <10
数组
- 格式 var arr:[Int] = [数值1, 数值2, 数值3]
- 不可变数组 let == NSArray
- 可变数组 var
- 不可以给不可变数组追加内容
let arr = [10, 20, 30] //开发中用这种 let arr2: [Int] = [10, 11, 12] let arr3: Array<Int> = [10, 11, 12] var arr4: [Int] // 先定义后使用的时候加数据类型 arr4 = [10, 11, 12] arr4[0] // 查找 arr4[0] = 55 // 修改 arr4.append(998) // 追加 arr4.removeAtIndex(0) // 移除 arr4.removeAll() // 全部移除 arr.capacity //开辟存储空间的规则: 2 的倍数 var arr5 = [Int]() //如何创建空数组
字典
- {} 替换为[]
- 去掉所有的@
let dict = ["name": "gm", "age": 30] let dict2: [String : NSObject] = ["name": "gm", "age": 30] let divt3: Dictionary<String, AnyObject> = ["name": "gm", "age": 30] let dict4 = [String: AnyObject]() // 在企业开发中,使用频率最高的字典类型就是[String: AnyObject] var dict = ["name": "gm", "age": 30] //可变 dict["name"] // 取值 dict["name"] = "mm" // 更新 dict["score"] = 99.9 // 新增 score之前是不存在的 dict.removeValueForKey("name") //移除 for key in dict.keys // 遍历 { print(dict[key]) } //将dict中的key 赋值给k, value 赋值给v for (k, v) in dict { print(k) print(v) }