常量變量
// 定義變量
var i = 10
print(i)
i = 15
print(i)
let j = 20
// 常量一經(jīng)定義不能自改數(shù)值
// j = 25
print(j)
階段性小結(jié)
var 定義變量,設(shè)置之后可以修改
let 定義常量,設(shè)置之后不可以修改
語句末尾不用使用 ;
在 Swift 中使用 print() 替代 OC 中的 NSLog
print 的性能更好,后面會演示定義 OC 對象
// 實(shí)例化視圖
let v = UIView(frame: CGRectMake(0, 0, 100, 100))
// 設(shè)置背景顏色
v.backgroundColor = UIColor.redColor()
// 添加到根視圖
view.addSubview(v)
-
階段性小結(jié)
- 在 Swift 中要實(shí)例化一個(gè)對象可以使用 類名() 的格式,與 OC 中的 alloc/init 等價(jià)
- OC 中的 initWithXXX 在 Swift 中通??梢允褂?類名(XXX: ) 找到對應(yīng)的函數(shù)
- OC 中的 [UIColor redColor] 類方法,在 Swift 中通??梢允褂?類名.XXX 找到對應(yīng)的函數(shù)
- 使用 let 修飾 v 并且賦值,表示 該常量的內(nèi)存地址不允許修改,但是可以修改其內(nèi)部的屬性
- 當(dāng)前對象的屬性,不需要使用 self.
- 常量&變量的使用原則:盡量先用 let,只有需要變的時(shí)候,再用 var,能夠更加安全
常量類型
let x = 10
let y = 10.5
let z: Double = 20
print(Double(x) + y)
print(x + Int(y))
print(y + z)
- 階段性小結(jié)
- 初次接觸 Swift 中會因?yàn)楹唵蔚?var let 誤以為 Swift 中的類型非常松散
- 其實(shí)所有變量的準(zhǔn)確類型都是在賦值的同時(shí)自動(dòng)推導(dǎo)的
- Swift 是對類型要求非常嚴(yán)格的一門語言,一個(gè)值永遠(yuǎn)不會被自動(dòng)轉(zhuǎn)換成其他類型
- 如果要轉(zhuǎn)換,必須顯示轉(zhuǎn)換,Swift 中
- 小數(shù)默認(rèn)是 Double 類型
- 整數(shù)默認(rèn)是 Int 類型
- 如果要顯式的指定變量的類型,可以在定義是使用 var 變量名: 類型 = 值
循環(huán)
- OC風(fēng)格的for
// 傳統(tǒng)寫法
for var i = 0; i < 10; i++ {
print(i)
}
- Swift風(fēng)格的 for
// 遍歷 0 ~ <10
for i in 0..<10 {
print(i)
}
print("---")
// 遍歷 0 ~ 10
for i in 0...10 {
print(i)
}
- 階段性小結(jié)
- Swift 中使用 in 關(guān)鍵字標(biāo)示循環(huán)的范圍
- 0..<10 表示從0到9
- 0...10 表示從0到10
- 注意之間不能出現(xiàn)空格
- 特殊寫法
for _ in 0...10 {
print("hello")
}
- 階段性小結(jié)
- 如果不關(guān)心循環(huán)本身的索引,可以使用 _ 忽略
- 這一技巧在之前的分支演練中出現(xiàn)過
數(shù)組
- 創(chuàng)建簡單數(shù)組
let arr = ["zhangsan", "lisi"]
print(arr)
// 遍歷每一個(gè)元素
for a in arr {
print(a)
}
// 像 OC 一樣打印
print(arr as NSArray)
- 數(shù)組中保存的對象類型
// 數(shù)組中保存的都是字符串
let arr = ["zhangsan", "lisi"]
// 數(shù)組中保存的是 NSObject
let arr1 = ["zhangsan", 1]
-
階段性小結(jié)
- 數(shù)組使用 [] 定義,這一點(diǎn)與 OC 相同
- 如果初始化時(shí),所有內(nèi)容類型一致,擇數(shù)組中保存的是該類型的內(nèi)容
- 如果初始化時(shí),所有內(nèi)容類型不一致,擇數(shù)組中保存的是
NSObject
常見數(shù)組操作
// 定義只能保存字符串類型數(shù)組
var array: [String]
// 初始化數(shù)組
array = ["zhangsan"]
// 添加元素
array.append("lisi")
print(array)
// 刪除元素
array.removeAtIndex(1)
print(array)
// 刪除所有元素
array.removeAll(keepCapacity: true)
print(array.capacity)
// 注意數(shù)組容量的變化
for i in 0..<10 {
array.append("\(i)")
print("\(array) --- \(array.capacity)")
}
// 實(shí)例化新的數(shù)組
var array2 = [String]()
array2.append("1")
array2.append("2")
// 拼接數(shù)組
array += array2
print(array)
- 階段性小結(jié)
- 如果定義數(shù)組時(shí)指定了保存對象的類型,擇不能向數(shù)組中添加其 他類型的內(nèi)容
- 可以使用 String
-
let定義的數(shù)組是不可變的 -
var定義的數(shù)組是可變的
字典
/// 定義并實(shí)例化字典
var dict = [String: AnyObject]()
dict["name"] = "zhangsan"
dict["age"] = 18
print(dict)
// 設(shè)置相同 key,之前的數(shù)值會被覆蓋
dict["name"] = "lisi"
print(dict)
// 刪除某一個(gè) key
dict.removeValueForKey("age")
print(dict)
dict["title"] = "manager"
print(dict)
// 遍歷字典(k, v可以隨便寫)
for (k, v) in dict {
print("\(k) -- \(v)")
}
// 合并字典
var dict2 = ["name": "wangwu", "age": 80, "title": "boss"]
for (k, v) in dict2 {
dict.updateValue(v, forKey: k)
}
print(dict)
字符串
- 在 Swift 中絕大多數(shù)的情況下,推薦使用 String 類型
- 使用 String 的原因
- String 是一個(gè)結(jié)構(gòu)體,性能更高
- String 目前具有了絕大多數(shù) NSString 的功能
- String 支持直接遍歷
- NSString 是一個(gè) OC 對象,性能略差
- Swift 提供了 String 和 NSString 之間的無縫轉(zhuǎn)換
- 遍歷字符串
let str = "我要飛的更High"
for s in str {
print(s)
}
- 字符串拼接
let str1 = "zhangsan"
let str2 = "lisi"
let i = 10
print(str1 + str2)
print("\(str1) \(str2) \(i)")
- 階段性小結(jié)
直接在 "" 中使用 (變量名) 的方式可以快速拼接字符串
小伙伴們再也不要考慮 stringWithFormat 了
格式化字符串
for _ in 0...10 {
let str = String(format: "zhangsan - %04d", arguments: [arc4random_uniform(100)])
print(str)
}
-
階段性小結(jié)
- 在實(shí)際開發(fā)中,如果需要指定字符串格式,可以使用 String(format:...) 的方式
- 注意:后面的參數(shù)需要放在一個(gè)數(shù)組中
- String & Range 的結(jié)合
以下是超級費(fèi)勁的代碼
let str: String = "我要飛的更High"
var subStr = str.substringWithRange(Range<String.Index>(start: str.startIndex, end: str.endIndex))
print(subStr)
- 建議寫法
let str1: NSString = "我要飛的更High"
print(str1.substringWithRange(NSMakeRange(0, 3)))
函數(shù)
- 簡單演練
func sum(a: Int, b: Int) -> Int {
return a + b
}
-
階段性小結(jié)
- 函數(shù)定義格式:func 函數(shù)名(參數(shù): 參數(shù)類型...) -> 返回值 { // 代碼實(shí)現(xiàn) }
- 如果沒有返回值, -> 返回值 可以省略
- -> 是一個(gè)很有意思的符號
- 默認(rèn)情況下,在調(diào)用函數(shù)時(shí),第一個(gè)參數(shù)名是省略的
- 參數(shù)名的特殊處理
強(qiáng)制要求參數(shù)名
func sum1(x a: Int, y b: Int) -> Int {
return a + b
}
- 省略參數(shù)名
func sum2(a: Int, _ b: Int) -> Int {
return a + b
}
閉包
- 閉包定義
- 閉包簡化 - 尾隨閉包
- 閉包參數(shù)
- 閉包返回值
- 閉包的循環(huán)引用
- 閉包類似c的block,就是一種特殊的數(shù)據(jù)類型
weak var weakSelf = self
demo("zhangsan") { (_) -> Int in
print(weakSelf?.view.backgroundColor)
return 20
}
- 閉包表達(dá)式優(yōu)化,
- 1.類型優(yōu)化, 由于函數(shù)中已經(jīng)聲明了閉包參數(shù)的類型, 所以傳入的實(shí)參可以不用寫類型
- 2.返回值優(yōu)化, 同理由于函數(shù)中已經(jīng)聲明了閉包的返回值類型,所以傳入的實(shí)參可以不用寫類型
- 3.參數(shù)優(yōu)化, swift可以使用$索引的方式來訪問閉包的參數(shù), 默認(rèn)從0開始
bubbleSort(&arr){
// (a , b) -> Int in
// (a , b) in
if $0 > $1{
return 1;
}else if $0 < $1
{
return -1;
}else
{
return 0;
}
}
// 如果只有一條語句可以省略return
let hehe = {
"我是lnj"
}
print(hehe())
懶加載
lazy var demoView: UIView = {
let v = UIView(frame: CGRectMake(10, 10, 100, 100))
v.backgroundColor = UIColor.redColor()
return v
}()
- 格式:
lazy var 變量: 類型 = { 創(chuàng)建變量代碼 }() - 懶加載的寫法本質(zhì)上是定義并執(zhí)行一個(gè)閉包
getter & setter
- 自定義 Person 類
class Person: NSObject {
var name: String?
var age: Int?
}
getter & setter
var _name: String?
var name: String? {
get {
return _name
}
set {
_name = newValue
}
}
在 Swift 中以上形式的 getter & setter 很少用didSet
在 OC 中,我們通常希望在給某一個(gè)變量賦值之后,去做一些額外的操作
最經(jīng)典的應(yīng)用就是在自定義 Cell 的時(shí)候,通過模型的設(shè)置方法完成 Cell 的填充
var length: Int? {
didSet {
timeStr = String(format: "%02d:%02d:%02d", arguments: [length! / 3600, (length! % 3600) / 60, length! % 60])
}
}
var timeStr: String?
計(jì)算型屬性
var title: String {
get {
return "Mr " + (name ?? "")
}
}
- 只實(shí)現(xiàn) getter 方法的屬性被稱為計(jì)算型屬性,等同于 OC 中的 ReadOnly 屬性
- 計(jì)算型屬性本身不占用內(nèi)存空間
- 不可以給計(jì)算型屬性設(shè)置數(shù)值
- 計(jì)算型屬性可以使用以下代碼簡寫
var title: String {
return "Mr " + (name ?? "")
}
構(gòu)造函數(shù)
init(dict: [NSObject: AnyObject]) {
name = dict["name"] as? String
age = dict["age"] as? Int
}
析構(gòu)函數(shù)
deinit {
print("88")
}
ATS 應(yīng)用傳輸安全
App Transport Security (ATS) lets an app add a declaration to its Info.plist file that specifies the domains with which it needs secure communication. ATS prevents accidental disclosure, provides secure default behavior, and is easy to adopt. You should adopt ATS as soon as possible, regardless of whether you’re creating a new app or updating an existing one.
If you’re developing a new app, you should use HTTPS exclusively. If you have an existing app, you should use HTTPS as much as you can right now, and create a plan for migrating the rest of your app as soon as possible.
- 強(qiáng)制訪問
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
- 設(shè)置白名單
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>