最近公司不忙,就抓紧学习了Swift, 因为本人发现越来越多的ios开发者用Swift写项目,趋势已经很明显,只是时间问题,现在将学习整理的笔记记录在博客里,其实个人感觉语法个不同点弄懂就可以了,框架和OC没啥大区别,一样的套路。
Swift是安全性极高的语言
1:简单值
let做常量 var做变量 ,常量值在编译的时候不需要知道,但是必须是精准的值,也就是说在初始化的时候进行赋值,可以被多次调用(等同于OC中的宏),它会根据初始化值进行判断,如无值时用冒号申明类型
let testInte = 70.0
var testDou: Double
值在转化为另一种类型时从不具有隐含性。如果需要转化值到另一种类型,明确性地为值进行格式转换。
String(width) 和 \(apples)两种方式转换为String
1.2 整数范围
整数类型的 min和 max 属性获取其最小值和最大值
1.3 类型别名
类型别名就是给一个类型定义的一个小名。通过 typealias关键字进行定义。
typealias testlias = UInt16 testlias 被定义为 UInt16 的一个别名
1.4 元祖
元组(tuples)是把多个值组合成一个复合值。元组内的值可以使任意类型,并不要求是相同类型。
let http404Error = (404, "Not Found") 该元组是将一个 Int 类型值和一个 String类型值组合在一起
1.4.1 分解元组数据
let (Code, Message) = http404Error 赋值、分解
println("The status code is \(Code)")
println("The status message is \(Message)")
可以使用索引访问元组中的各个元素
println("The status code is \(http404Error.0)")
1.4.2 如果你只需要一部分元组的值,忽略的部分用下划线(_)标记:
let (Code, _) = http404Error
注意:元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体
1.5:可选(Optionals)
Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,如果在使用变量之前不进行初始化就会报错
1.5.1使用可选(optionals)来处理可能缺失值的情况
var age: String? 问号表示是可选的
// age自动得到默认值:nil
// 这个nil跟Objective-C中的nil不同,不是指针,而是表示值不存在。
例如: String类型有一个方法 toInt ,用于将一个 String 值转换成一个 Int 值
字符串 "123" 可以被转换成数字123,但是"hello, world"是不行的。
如果定义一个可选常量或变量没有提供默认值,它们会被自动设置为nil
var test: String?
注意:Swift 的nil和 Objective-C 的nil并不一样。在 Objective-C 中,nil是一个指向不存在对象的指针。在 Swift 中,nil不是指针,它是一个确定的值,用来表示值的缺失。任何类型的可选都可以被设置为nil,不只是对象类型
1.5.2 隐式强拆包类型(就是一种普通的可选)
使用!来声明变量, 在调用时不需要使用?或!来说明。
声明一个隐式解析可选的方式是:把可选的类型的后面的问号(String?)改成感叹号(String! )。
let testString: String!
注意:如果一个变量值可能变成 nil的话请不要使用隐式解析可选。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选。
1.6 运算符
1.6.1 不同于 C 和 Objective-C,Swift中是可以对浮点数进行取余。
8 % 2.5 // 结果是 0.5
一元正号(-)可以切换
一元正号(+)不做任何改变的操作数的值。
let min = -6
let alsoMinusSix = +min // 结果 -6
1.6.2 Swift 有两个区间运算符:闭区间运算符( a...b)和半闭区间 ( a..b )运算符
闭区间运算符(a...b):包含从 a到 b (包括 a和 b )之间的所有的值。
半闭区间运算符(a..b):定包含从 a到 b 但不包括 b的区间内的所有的值
1.8 数组、字典
Array<SomeType>,或者简写为 SomeType[]
通过 [] 创建一个数组和字典,通过 index和 key 获取对应的值
var shoppiNil = String[]() 空数组
var shoppingList = ["360", "特步", "唐狮", "nike"]
var shoppDictNil = Dictionary<key,value>()
var shoppingDict = ["360":"x123", "特步":"x234", "唐狮":"x345", "nike":"x456"]
1.8.1 数组基本属性用法
使用 isEmpty属性判断count是否为0
使用 append 方法在数组尾部增加新的元素
使用数组的 insert (atIndex:)方法在 atIndex 之前添加元素
使用 removeAtIndex方法来移除数组中的某一项
enumerate 来进行数组遍历。enumerate返回一个由元素索引值和数据值组成的键值对
数组还提供了创建特定大小并且元素被同时初始化的构造器。把数组的元素数量(count)和初始值(repeatedValue)传入数组即可:
例:Double[](count: 3, repeatedValue: 0.0)
1.8.2 字典基本语法
updateValue(forKey:) 方法可以添加或者更新 forKey对应的值。 方法返回的是包含一个字典值类型的可选值
removeValueForKey 方法也可以用来从字典中移除键值对
keys 或者 values属性(都是可遍历的集合)遍历字典的键或值:
2:函数
定义:func saySwift(personName: String) -> String {}
以 func 关键字开头 (参数名:参数类型) ->紧跟着的是返回值类型
// 注: switch支持任意类型的数据,不仅仅是整数类型不在需要break结尾
// 函数可以嵌套,被嵌套的函数可以访问外部函数变量
3:闭包
3.1.1
sort函数主要是对同一类型的数组值进行排序
sort 函数需要传入两个参数: sort(数组,闭包函数) 第二个参数(闭包函数): (String, String) -> Bool类型的闭包
闭包函数:需要传入与数组元素类型相同的两个参数值,并返回一个布尔值来告诉 sort函数传入的两个参数的顺序
内联闭包的sort
let reversed = sort(names, { (s1: String, s2: String) -> Bool in
return s1 > s2
})
闭包表达式语法:函数和返回值类型都写在大括号内
{ ( parameters ) -> returntype in
return statements
}
内联闭包的函数体部分由关键字in引入
4:拷贝
字典中keys或values值是值类型时,发生赋值操作,那这个字典就会被拷贝
1. var ages = ["Peter": 23, "Wei": 35, "Anish": 65, "Katya": 19]
2. var copiedAges = ages
拷贝行为:就是产生了两个单独的实例,但是初始内容是相同的
1. copiedAges["Peter"] = 24
2. println(ages["Peter"])
3. // 输出 "23" 与copiedAges是单独的两个实体,所以没有任何关系
2:数组比字典复杂,对数组来说,拷贝行为仅仅当操作有可能修改数组长度时才会发生
1. var a = [1, 2, 3]
2. var b = a
3. var c = a
无拷贝行为:就还只是一个实例,修改值会相应改变
a[0] = 42
println(a[0]) // 42
println(b[0]) // 42
println(c[0]) // 42
我们通过使用恒等运算符 === 来判定两个数组共用相同的储存空间或元素。
我们通过使用==运算符来判断两个字符串是否相同(取代OC中的isEqualToString)
结束语:经过学习语法及不同点后,接下来我将把以前的OC项目用Swift写一篇,加强实战是最容易掌握这门语言的方法。我会记录下项目的进展及代码共享