Swift筆記

注意點(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)被修改,需要是&param指針類型,不能為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 >== special if

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ù)組 (泛型集合,一般不存放不同類型元素)

  1. initializer

    * 1. let array = [1, 2, 3, 4, 5]
    * 2. var arrayM = [String]()
    
    
  2. 拼接 > array + array2(+ 僅限array1 與array2元素類型相同)

  3. 遍歷 > 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)!")
      }
  • 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钧排,一起剝皮案震驚了整個(gè)濱河市制轰,隨后出現(xiàn)的幾起案子前计,更是在濱河造成了極大的恐慌,老刑警劉巖垃杖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件男杈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缩滨,警方通過查閱死者的電腦和手機(jī)势就,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門泉瞻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脉漏,“玉大人,你說我怎么就攤上這事袖牙〔嗑蓿” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵鞭达,是天一觀的道長(zhǎng)司忱。 經(jīng)常有香客問我,道長(zhǎng)畴蹭,這世上最難降的妖魔是什么坦仍? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮叨襟,結(jié)果婚禮上繁扎,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好梳玫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布爹梁。 她就那樣靜靜地躺著,像睡著了一般提澎。 火紅的嫁衣襯著肌膚如雪姚垃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天盼忌,我揣著相機(jī)與錄音积糯,去河邊找鬼。 笑死谦纱,一個(gè)胖子當(dāng)著我的面吹牛絮宁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播服协,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼绍昂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了偿荷?” 一聲冷哼從身側(cè)響起窘游,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跳纳,沒想到半個(gè)月后忍饰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寺庄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年艾蓝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斗塘。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赢织,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馍盟,到底是詐尸還是另有隱情于置,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布贞岭,位于F島的核電站八毯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瞄桨。R本人自食惡果不足惜话速,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芯侥。 院中可真熱鬧泊交,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至白指,卻和暖如春留晚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背告嘲。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工错维, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人橄唬。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓赋焕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親仰楚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隆判,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 初見swift 打印‘hello world' print("hello world"); 教程 類型 基礎(chǔ)類型:...
    PanPan1127閱讀 853評(píng)論 0 2
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語(yǔ)閱讀 3,830評(píng)論 0 6
  • 渲染: 1 當(dāng)前屏幕渲染:在GPU的當(dāng)前屏幕緩沖區(qū)中進(jìn)行的渲染 2 離屏渲染:在GPU當(dāng)前屏幕緩沖區(qū)外另建緩沖區(qū)渲...
    adrian920閱讀 377評(píng)論 0 0
  • 1、隨機(jī)數(shù) 不需要隨機(jī)數(shù)種子 arc4random()%N + begin:產(chǎn)生begin~begin+N的隨機(jī)數(shù)...
    我是小胡胡123閱讀 4,153評(píng)論 0 2
  • 1僧界、范型范型所解決的問題 函數(shù)侨嘀、方法、類型:類捂襟,結(jié)構(gòu)體咬腕,枚舉,元組類型葬荷,協(xié)議參數(shù)涨共,返回值,成員函數(shù)參數(shù)宠漩,成員屬性類...
    我是小胡胡123閱讀 819評(píng)論 0 1