注意點(diǎn)
- 1.無隱式轉(zhuǎn)換
Float(param)
通用
關(guān)鍵字
注意: 不可以在一個(gè)實(shí)體中定義訪問級(jí)別更低的實(shí)體
-
1.方法/屬性
* internal: 在本模塊(項(xiàng)目/bundle/target)中都可以訪問,系統(tǒng)默認(rèn)的方法/屬性權(quán)限
* private: 只有在本類中才可以訪問(extension亦不可訪問,修飾方法是需要加@objc)
* fileprivate: 在類所在文件中都可以訪問
* open: 可以跨模塊訪問(系統(tǒng)類可訪問的屬性/方法均為open)
internal/fileprivate/private(set) 改變set訪問權(quán)限* mutating: 修飾函數(shù),表示該函數(shù)可以修改函數(shù)所屬實(shí)例(屬性) * subscript: 下標(biāo)語(yǔ)法 * inout: 輸入輸出參數(shù),表示傳入的參數(shù)本身會(huì)在函數(shù)內(nèi)被修改,需要是¶m指針類型,不能為let類型或者有默認(rèn)值 *convenience: 便利構(gòu)造器 @required: 必要的 required init(){ //構(gòu)造器代碼 }
2.類型
* 1.AnyObject > 任意class類型
* 2.Any > 任意類型,包括函數(shù)類型
* 3.as > 類型轉(zhuǎn)換 A as B (switch A to B)3.文件級(jí)
SwiftCustomLogFunction
func log<T>(message: T, file: String = #file, function: String = #function, line: Int = #line) {
// setting: buildPhases - Swift complier-Custom Flags - Other Swift Flags - Debug -+ -D DEBUG
#if DEBUG
let fileName = (#file as NSString).lastPathComponent.split(separator: ".")
print(">> \(message) << line:\(line) \(fileName) . \(function)")
#endif
}
邏輯語(yǔ)句
- 1.
if
> Swift所有條件表達(dá)式無
非0/nil即真的概念 - 2.
guard
>== specialif
guard 條件表達(dá)式1 else {
//條件1false 異常處理code
return/break/continue/throw 關(guān)鍵字
}
(條件1ture) 執(zhí)行語(yǔ)句
guard 條件表達(dá)式2 else {
//條件1true + 條件2false 異常處理
return/break/contine/throw 關(guān)鍵字
}
(條件1true + 條件2true)執(zhí)行語(yǔ)句
```
- 3.
switch
* 1.判斷條件可以使:Int \ Floaf \ String \ 區(qū)間范圍
* 2.關(guān)鍵字fallthrough (默認(rèn)每個(gè)case 語(yǔ)句包含break)
* 3.case 可以跟多個(gè)判斷表達(dá)式 > case : 條件1, 條件2
- 4.
repeat while
>==do wile inOC
字符串
- 1.
拼接
>str1 + str2
- 2.
和標(biāo)識(shí)符拼接
>\(param)
: "name is \(name), age is \(age)" - 3.
格式化
>String(format: arguments:)
: String(format: "%02d:%02d", arguments:[min, second]); - 4.
as NSString用法
>常用于截取字符串場(chǎng)景: (urlString as NSString).substringToIndex(3)
數(shù)組 (泛型集合,一般不存放不同類型元素)
-
initializer
* 1. let array = [1, 2, 3, 4, 5] * 2. var arrayM = [String]()
拼接
>array + array2
(+ 僅限array1 與array2元素類型相同)遍歷 > for param in array[0..<2] { }
字典
- 1.
initializer
* 1. let dict = ["key1" : "value1", "key2" : "value2"]
* 2. var dictM = Dictionary<String : anyObject>()
- 2.
增/改 刪 查
dictM[key] = value (無key為增, 有key為改)
dictM.removeValue(forKey: "key") 刪
dictM["key"]
for (key, value) in dictM {
dictM[key] = value
}
元組
initializer
* 1. let info = (name : "why", age : 19, height : 1.88) > info.name
* 2. let info = ("why", 18, 1.88) > info.index >= info.1
* 3. let (name, age, height) = ("why", 18, 1.89) > name
可選類型
- 1.
initializer
* 1. var name : String? = nil
* 2. var name : Optional<String> = nil
example:
let errorInfo = (errorCode: 404, errorMessage: "Not Found")
- 2.
強(qiáng)制解包
與可選綁定
1. optionalName! > 注意:強(qiáng)制解包前一定要判斷!= nil,否則崩潰
2. if let optionalName = optionalName {
執(zhí)行optionalName用途
}
相當(dāng)于執(zhí)行2步操作: 判斷optionalName != nil, optionalName = optionalName!
(當(dāng)optionalName == nil,不執(zhí)行{ }代碼)
函數(shù)
- 1.
intializer
func 函數(shù)名(參數(shù)名: 參數(shù)類型, 參數(shù)名2: 參數(shù)類型) -> 返回值類型 {
函數(shù)代碼塊
return 返回值
}
- 2.
使用注意
* 1. 內(nèi)部參數(shù) & 外部參數(shù) (參數(shù)別名可見范圍區(qū)分,默認(rèn)第一個(gè)參數(shù)為內(nèi)部參數(shù),其余為外部參數(shù)) 參數(shù)1轉(zhuǎn)換成外部參數(shù) > 在參數(shù)1前再+別名 * 2. 默認(rèn)參數(shù) func makeCoffee(coffeeName: String = "雀巢") -> String {} makeCoffee() * 3. 可變參數(shù)(參數(shù)數(shù)組) func calculator(params: Int...) -> Int { var result = 0 for param in params { result += param } return result } * 4. 指針參數(shù) func swapNum(inout m: Int, inout n: Int) { let temp = m m = n n = temp } swapNum(m: &m, n: &n) * 5. 函數(shù)嵌套 func nestFunc() { func test() { print("Test") } print"nestFunc" test() }
枚舉
注意: Swift枚舉值可以是Int,Float,character,String,并且不手動(dòng)提供枚舉值,系統(tǒng)不會(huì)默認(rèn)指定,如果需要指定枚舉值,則必須在枚舉后指定枚舉值類型
定義
* 1. enum CompassPoint {
case North
case South
case East
case West
}
* 2. enum Planet: Int { // 可以枚舉列舉在一行
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
結(jié)構(gòu)體
- 1.
結(jié)構(gòu)體是一個(gè)數(shù)據(jù)結(jié)構(gòu)/值類型,在方法中是值傳遞, 類是指針傳遞
- 2.
定義格式: struct 結(jié)構(gòu)體名稱 { // 屬性和方法 }
struct Location {
var x: Double
var y: Double
/// 構(gòu)造函數(shù)必須確保素有成員變量都有被初始化,構(gòu)造函數(shù)都不需要返回值
// 系統(tǒng)默認(rèn)會(huì)創(chuàng)建此種構(gòu)造函數(shù)
init(x: Double, y:Double) {
self.x = x
self.y = y
}
// 如果手動(dòng)創(chuàng)建構(gòu)造函數(shù),就會(huì)覆蓋默認(rèn)構(gòu)造函數(shù),但可以手動(dòng)再創(chuàng)建
init(xyString: String) {
let strs = xyString.components(separatedBy: ",")
self.x = Double(strs.first ?? "0") ?? 0
self.y = Double(strs.last! ?? "0") ?? 0
}
}
/// 枚舉拓展 - 可以拓展系統(tǒng)定義的結(jié)構(gòu)體
extension Location {
mutating func move(x: Double, y: Double) { // 結(jié)構(gòu)體可以擴(kuò)充方法,修改成員變量的方法必須+ mutating
self.x += x
self.x += y
}
}
類
class Student : NSObject {
/***** 屬性3種 *****/ // 初始化類的屬性一般要賦值(值類型屬性)或者指定可選類型(對(duì)象屬性)
/// 1.存儲(chǔ)屬性
var englishScore: Double = 0.0
var chineseScore: Double = 0.0
/// 2.計(jì)算屬性
var averageScore: Double {
return (englishScore + chineseScore) * 0.5
}
/// 3.類屬性
static var courseCount: Int = 0
/***** 構(gòu)造函數(shù) *****/
/// 1.重寫構(gòu)造函數(shù)
override init() {
super.init()
// custom initCode
}
/// 2.自定義構(gòu)造函數(shù)
init(englishScore: Double, chineseScore: Double) {
super.init() // 可省略,init默認(rèn)會(huì)調(diào)用super.init()
self.englishScore = englishScore
self.chineseScore = chineseScore
}
/// 3.自定義構(gòu)造函數(shù)withDictionary
// init(dictT: [String : AnyObject]) {
// if let score = dictT["chineseScore"] as? Double {
// chineseScore = score
// }
// }
init(dict: [String : AnyObject]) {
super.init()
setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forUndefinedKey key: String) {} // 必須重寫防止崩潰
/***** 類方法 *****/
class func classFunc() {}
/***** 屬性監(jiān)聽器器 *****/
var targetValue: Int = 0 {
willSet { /* newValue */ }
didSet { /* oldValue */ }
}
/****** 下標(biāo)語(yǔ)法 *****/
subscript (index: Int) -> Int { // 必須要有返回值 getter
get {
return index * index;
}
set { // newValue }
}
/***** 銷毀 *****/
deinit {
相當(dāng)于dealloc inOC
}
}
Student.courseCount = 2
let student = Student()
student.englishScore = 78.0
student.chineseScore = 80.0
可選鏈
- 1.
從可選鏈中進(jìn)行取值?
> 返回值是可選類型,其中任意可選為nil,則整個(gè)可選鏈結(jié)果為nil let toy = person.dog?.toy? - 2.
可選鏈獲取目標(biāo)進(jìn)行賦值或調(diào)用方法
> 可選鏈任一部分為nil,不執(zhí)行后續(xù)代碼\方法 person.dog?.toy? = "Hello Kity"
協(xié)議
注意點(diǎn)
0.協(xié)議作為類型,可以作為參數(shù)類型或返回值類型,集合元素類型
1.協(xié)議協(xié)議遵守者可以是 class, enum, static
2.代理類型的協(xié)議需要: class > 這樣可以用執(zhí)行修飾class的weak修飾可選類型的delegate
3.optional特性來自O(shè)C,需要定義optional func 需要在protocol 和該方法前 + @objc
4.協(xié)議定義屬性:要求協(xié)議遵守者提供協(xié)議定義的屬性,使用var定義,且只定義屬性的名稱匀油、類型、讀寫屬性
-
用法
- & 把兩個(gè)協(xié)議結(jié)合成一個(gè)臨時(shí)局部協(xié)議 : A & B
func wishHappyBirthday(to celebrator: NamedProtocol & AgedProcotol) {
print("Happy birthday, (celebrator.name), you're (celebrator.age)!")
}
- & 把兩個(gè)協(xié)議結(jié)合成一個(gè)臨時(shí)局部協(xié)議 : A & B
-
example
@objc protocol SportProtocol {//協(xié)議遵守者可以是 class, enum, static func playBasketball() @objc optional func playFootball() } protocol purchaseDelegate: class {// func buy() } class person: SportProtocol { weak var deletage: purchaseDelegate? func goForeign() { deletage?.buy() } // SportProtocol implementation func playBasketball() { } }
# 擴(kuò)展 extension
* 1.**定義**:為已有的類 結(jié)構(gòu)體 枚舉或者協(xié)議添加新功能
* 2.**功能:**(類似 分類 inObjc)
1.添加計(jì)算型 類/實(shí)例屬性
2.定義 實(shí)例/類方法,包括構(gòu)造器
3.定義下標(biāo)
4.定義和使用新的嵌套類型
5.使一個(gè)已有類型符合某個(gè)協(xié)議
* 3.**注意** 只能添加,不能重寫已有功能
# 閉包
* 1.`格式: 類型 (參數(shù)列表) -> (返回值)`
閉包的寫法:
類型:(形參列表)->(返回值)
技巧:初學(xué)者定義閉包類型,直接寫()->().再填充參數(shù)和返回值
值:
{
(形參) -> 返回值類型 in
// 執(zhí)行代碼
}
* 2.`閉包解決循環(huán)引用`
```
方式1: == 簡(jiǎn)寫方式2
tools.loadData{[weak self] (jsonData) -> () in {
self?.view.backgroundColor = UIColor.redColor
}
}
方式2:
weak var weakSelf = self
tools.loadData { (jsonData) -> () in {
weakSelf?.view.background = UIColor.redColor // 如果weakSelf != nil 執(zhí)行語(yǔ)句
}
}
```
* 3.`尾隨閉包` > `當(dāng)閉包是函數(shù)的最后一個(gè)參數(shù),則該閉包為尾隨閉包,尾隨閉包函數(shù)可以將閉包提到()后,如果函數(shù)只有一個(gè)參數(shù)且為閉包,則可以省略參數(shù)列表外的()`
# Error
* 1.定義
func 方法(參數(shù)) throws返回值 {
條件語(yǔ)句 {throw someError}
}
example:
func age(age : Int) throws -> String {
if age < 0 {
throw AgeError.wrongAge // 錯(cuò)位定義成枚舉類型, throw == return in 流程控制
}
return "OK"
}
* 2.處理 - 未被catch的error將層層傳遞
```
1. do catch
do {
try throws類型的函數(shù)
} catch 特定error {// 特定error
} catch {// 所有error
}
example:
do {
try student.age(age: -1)
} catch {
print("error")
}
2. try try? & try!(類似強(qiáng)制解包>有崩潰風(fēng)險(xiǎn))
try? > let str = stry? tudent.age(age: 10) 如果拋出錯(cuò)誤,str = nil, 如果未拋出錯(cuò)誤, str = 返回值
```
# 指定清理操作 defer
* `1. 用途` defer定義在即將離開當(dāng)前代碼塊時(shí)執(zhí)行的語(yǔ)句,離開當(dāng)前代碼塊包括return , break, throw ERROR等
* `2.注意:` defer語(yǔ)句中不能有流程控制轉(zhuǎn)移,如break, return, throw ERROR等
* `3.順序` 多條fefer語(yǔ)句,反序執(zhí)行,即最后的defer語(yǔ)句最先執(zhí)行
func processFile(filename: String) throws {
if exists(filename) {
let file = open(filename)
defer {
close(file)
}
while let line = try file.readline() { // 處理文件。
}
// close(file) 會(huì)在這里被調(diào)用,即作用域的最后榄攀。 }
}
# 類型轉(zhuǎn)換
* 1.判斷字:**is** > **if** *(something)* **is** *(anotherThing)* *return true/false*
* 2.關(guān)鍵字:**as** > ** if let item = product as? Movie**
# 元類型
類蔽莱、結(jié)構(gòu)體、枚舉類型的元類型: .Type / type(of: someInstance) > example: SomeClass.Type
協(xié)議的元類型: .Protocol > example: SomeProtocal.Protocol