1> 導(dǎo)入框架 :import UIKit
2> 定義標(biāo)識符: let/var let a:Int = 20
3> 語句結(jié)束時;可以省略
4> print(a)
常量變量
1> 在開發(fā)中,優(yōu)先使用常量(let). 只有發(fā)現(xiàn)標(biāo)識符需要修改時,再使用變量
// 目的: 防止在其它不希望修改的地方,不小心將值修改掉
2> 常量的本質(zhì): 指向的內(nèi)存地址不可以修改,但是可以通過內(nèi)存地址找到對應(yīng)的對象,之后修改對象內(nèi)部的屬性
let view : UIView = UIView()
view.backgroundColor = UIColor.blue
基本運算
將Int類型轉(zhuǎn)成Double: Double(標(biāo)識符)
邏輯分支 if
1> if后面的()可以省略掉
2> 沒有非0(nil)即真
邏輯分支 guard
條件不滿足時才執(zhí)行else里面的語句
guard age >= 18 else {
print("回家去")
return
}
邏輯分支 switch
1.switch的基本使用
1> switch()可以省略
2> case結(jié)束可以不加break
2.基本使用補充
1> case后面可以跟上多個條件
2> 如果希望產(chǎn)生case穿透,可以在case結(jié)束時fallthrough
3.可以判斷多種類型
1> 浮點型
2> 字符串
3> 區(qū)間類型
循環(huán)使用 for
- Swift中for循環(huán)現(xiàn)在只支持區(qū)間遍歷 0..<10/0...9
2.在swift開發(fā)中,如果一個變量/常量暫停不會使用,那么可以使用_來代替
循環(huán)使用 while
1> while后面()可以省略
2> 沒有非0(nil)即真 Bool(true/false)
字符串
1.字符串的定義
1> 不可變字符串的定義 let str = "Hello Swift"
2> 可變字符串的定義 var strM = "Hello World"
2.獲取字符串的長度 let length = str.characters.count
3.字符串的拼接
1> 字符串之間的拼接 let str3 = str1 + str2
2>字符串和其它標(biāo)識符之間的拼接 "(標(biāo)識符)"
let name = "why"
let age = 19
let infoStr = "my nams is (name), age is (age)"
3> 字符串拼接過程中格式化: String(format:"%d:%d", 參數(shù))
4.字符串的截取
1>方式一: 將String轉(zhuǎn)成NSString,再進(jìn)行截取(推薦)
let header1 = (urlString as NSString).substring(to: 3)
let range1 = NSMakeRange(4, 5)
let middle1 = (urlString as NSString).substring(with: range1)
let footer1 = (urlString as NSString).substring(from: 10)
2> 方式二: 直接使用String中方法,進(jìn)行截取. String.Index (不好用)
數(shù)組
1.數(shù)組的定義
1> 定義不可變數(shù)組 let array1 = ["why", "yz"]
2> 定義可變數(shù)組 var arrayM = [String]()
2.對可變數(shù)組的基本操作
增刪改查 arrayM.append("why") arrayM.remove(at: 0)
arrayM[0] = "yz" let item = arrayM[1]
3.數(shù)組的遍歷
1> 獲取數(shù)組的長度 let count = array.count
2> 數(shù)組的遍歷(i/item/index-item)
獲得下標(biāo) for i in 0..<count
獲得下標(biāo) for item in array
既獲取下標(biāo)值,又獲取元素 for (index, item) in array.enumerated()
4.數(shù)組的合并知市,兩個數(shù)組中存放的是相同的元素直接合并 array1 + array2
字典
1.定義的定義
1> 不可變字典: let dict : [String : Any] = ["name" : "why", "age" : 18]
2> 可變字典: var dictM = [String : Any]()
2.對可變字典的基本操作
增刪改查 dictM["name"] = "why" dictM.removeValue(forKey: "height")
3.遍歷字典
1> 所有的key for key in dict.keys
2> 所有的value for value in dict.values
3> 所有的key/value for (key, value) in dict2
4.字典合并
dict1 可變 dict2 不可變
for (key, value) in dict2 {
dict1[key] = value
}
元組
使用元組保存信息(取出數(shù)據(jù)時,更加方便)
寫法1 let infoTuple0 = ("why", 18, 1.88) let tupleName = infoTuple0.0
寫法2 let infoTuple1 = (name : "why",age : 18, height : 1.88) infoTuple1.age
寫法3 let (name, age, height) = ("why", 18, 1.88) name
可選類型
在開發(fā)中,只有可選類型才能賦值為nil, 其它類型都不能賦值為nil
只要一個類型有可能為nil, 那么這個標(biāo)識符的類型一定是一個可選類型
1.定義可選類型 var name : String? = nil
2.給可選類型進(jìn)行賦值 name = "why"
3.從可選類型中取值
if let name = name {
print(name)
}
類型轉(zhuǎn)換
- as使用 (str as NSString).substring(to: 6)
- as?轉(zhuǎn)成可選類型 let name = tempName as? String
- as!轉(zhuǎn)成具體的類型 如果確定轉(zhuǎn)化成功,再用as!, 平時不建議
函數(shù)
內(nèi)部參數(shù): func sum(_ num1 : Int, _ num2 : Int) -> Int
外部參數(shù): func sum(num1 : Int, num2 : Int, num3 : Int) -> Int
可變參數(shù): func sum(_ nums : Int...) -> Int
默認(rèn)參數(shù) func makeCoffee(coffeeName : String = "雀巢") -> String
指針函數(shù)
func swapNum(num1 : inout Int, num2 : inout Int) {
let temp = num1
num1 = num2
num2 = temp
}
swapNum(num1: &m, num2: &n)
枚舉
創(chuàng)建枚舉1
enum Direction : Int {
case east = 0
case west = 1
case north = 2
case south = 3
}
創(chuàng)建枚舉2
enum Direction {
case east, west, north, south
}
1>當(dāng)原始值的類型為整數(shù)時嫂丙,系統(tǒng)將隱式地對成員值賦值且值依次遞增1跟啤,若第一個成員值沒有設(shè)置原始值,則默認(rèn)為0腥光。
2>當(dāng)原始值的類型為String類型時,每個枚舉成員的隱式原始值是該成員的名稱
結(jié)構(gòu)體
1.定義結(jié)構(gòu)體
struct Location {
var x : Double
var y : Double
// 最普通的函數(shù): 該函數(shù)是沒有用到成員屬性
func test() {
print("結(jié)構(gòu)體中的test函數(shù)")
}
// 改變成員屬性 : 如果在函數(shù)中修改了成員屬性, 那么該函數(shù)前必須加上mutating
mutating func moveH(_ distance : Double) {
self.x += distance
}
// 給結(jié)構(gòu)體擴充構(gòu)造函數(shù)
// 1> 默認(rèn)情況下, 系統(tǒng)會為每一個結(jié)構(gòu)體提供一個默認(rèn)的構(gòu)造函數(shù), 并且該構(gòu)造函數(shù), 要 求給每一個成員屬性進(jìn)行賦值
// 2> 構(gòu)造函數(shù)都是以init開頭, 并且構(gòu)造函數(shù)不需要返回值
// 3> 在構(gòu)造函數(shù)結(jié)束時, 必須保證所有的成員屬性有被初始化
init(xyStr : String) {
// 20,30 --> ["20", "30"]
let array = xyStr.components(separatedBy: ",")
let item1 = array[0]
let item2 = array[1]
// ?? 判斷前面的可選類型是否有值
// 有值, 則解包, 沒有值,則使用后面的值
self.x = Double(item1) ?? 0
self.y = Double(item2) ?? 0
}
}
2.創(chuàng)建結(jié)構(gòu)體對應(yīng)的值 var center = Location(x: 20, y: 30)
3.系統(tǒng)結(jié)構(gòu)體的創(chuàng)建方式 let size = CGSize(width: 20, height: 20)
4.給結(jié)構(gòu)體擴充方法 center.test() center.moveH(20)
5.給結(jié)構(gòu)體擴充構(gòu)造函數(shù) Location(xyStr : "20,30")
**類似于class 但是class是類型引用痘番,而struct是值引用
struct沒有繼承的功能,class有繼承功能
swift在本質(zhì)上來說是面向協(xié)議的, 所以使用struct+protocol是構(gòu)成swift面向協(xié)議語言的基礎(chǔ)
義的對象類型 都可以改成結(jié)構(gòu)體去定義
模型 都可以改成機構(gòu)體
Swift 常用的 String, Array, Dictionary 都是 struct
結(jié)構(gòu)體封裝少量相關(guān)簡單數(shù)據(jù)值
數(shù)據(jù)需要被拷貝而不是被引用汞舱,不需要繼承的時候
類的使用
1.如何定義類
class Person {
// 如果屬性是值類型, 則初始化為空值
// 如果屬性是對象類型, 則初始化為nil值
var name : String = ""
var age : Int = 0
var view : UIView?
}
2.創(chuàng)建類的對象
let view = UIView()
類的構(gòu)造函數(shù)(KVC)
使用KVC條件
1> 必須繼承自NSObject
2> 必須在構(gòu)造函數(shù)中,先調(diào)用super.init()
3> 調(diào)用setValuesForKeys
4> 如果字典中某一個key沒有對應(yīng)的屬性, 則需要重寫setValue forUndefinedKey
class Person : NSObject {
var name : String = ""
var age : Int = 0
var height : Double = 0
init(dict : [String : Any]) {
super.init()
setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}
類的析構(gòu)函數(shù) -相當(dāng)dealloc
class Person {
var name : String = ""
var age : Int = 0
// 重寫析構(gòu)函數(shù), 監(jiān)聽對象的銷毀
deinit {
print("Person --- deinit")
}
}
var p : Person? = Person()
p = nil
循環(huán)引用解決方案
OC中表示弱引用 __weak/__unsafe_unretained(野指針錯誤)
Swift中表示弱引用 weak/unowned(野指針錯誤)
// unowned 不能用于修飾可選類型
unowned var owner : Person = Person()
可選鏈
當(dāng)類中包含的元素特別多時昂芜,可以把里面的元素單獨出類來包含,取值時可使用可選鏈
1> 從可選鏈中進(jìn)行取值?.
2> 給可選鏈進(jìn)行賦值
3> 可選鏈調(diào)用方法