[Swift]SwiftconChina 2016 干貨濕貨整理

Notes:

本來(lái)計(jì)劃花個(gè)1、2天就把這個(gè)整理下,結(jié)果,越來(lái)越忙
,那索性就做個(gè)長(zhǎng)遠(yuǎn)計(jì)劃吧,花個(gè)1、2個(gè)月把這個(gè)整理完,也當(dāng)成自己學(xué)習(xí)swift的一個(gè)筆記吧...

Time:

2016-04-23 ~ 2016-04-24

Location:

Shanghai

Content:


First Day:
  • 《一個(gè)Swift項(xiàng)目的網(wǎng)絡(luò)變遷 -- 陳乘方》
  • 《Objective-C和Swift的跨平臺(tái)開(kāi)發(fā) -- Tinyfool》
  • 《逆向工程:從Objective-C到Swift -- 包涵卿》
  • 《擁抱Swift3.0與未來(lái)展望 -- 圖拉鼎》
  • 《Swift語(yǔ)言的設(shè)計(jì)取舍及跨語(yǔ)言調(diào)用 -- 董一凡》
  • 《從數(shù)學(xué)函數(shù)角度理解函數(shù)式編程 -- 丁峰》
Second Day:
  • 《Swift設(shè)計(jì)模式 -- 老鎮(zhèn)》
  • 《Redux in Swift——新一代的iOS應(yīng)用架構(gòu) -- 方志剛》
  • 《Asynchronous Programming in Swift,Swift異步編程 -- 劉冠杉》
  • 《讀Swift源碼,理解Monad -- 唐巧》
  • 《How to parse float numbers-the really hard way -- 傅若愚》

Summarize

  • 說(shuō)直白點(diǎn),這次會(huì)議持續(xù)2天,11個(gè)分享內(nèi)容,看著面還是挺廣的,從設(shè)計(jì)模式到語(yǔ)言層面再到應(yīng)用和逆向,基本幾個(gè)大的方向該有的都有了,不過(guò)聽(tīng)了2天云里霧里,回頭就記得一句話(huà)"函數(shù)式編程"...
  • 不過(guò)這種會(huì)議本身不能指望幾個(gè)小時(shí)內(nèi)學(xué)完人家的全部功力(唐巧大哥學(xué)了一年monad了,做了100多頁(yè)P(yáng)PT才做了這個(gè)不到一小時(shí)的分享),但是能找到幾個(gè)方向就已經(jīng)算是有收獲了,哈哈.
  • Swift目前的項(xiàng)目還沒(méi)有用起來(lái),這次分享的東西很多東西,估計(jì)近期都是不太可能接觸或者使用的,所以趕緊總結(jié)下,免得過(guò)幾個(gè)月,回頭忘光了...

Detail

應(yīng)用:


《一個(gè)Swift項(xiàng)目的網(wǎng)絡(luò)變遷 -- 陳乘方》

polen:
這個(gè)就是把大象裝進(jìn)冰箱需要幾步的問(wèn)題(把OC項(xiàng)目改為Swift項(xiàng)目需要幾步):

1. 把OC的代碼照搬翻譯成Swift
2. 開(kāi)始"更Swift"地寫(xiě)代碼:使用Enum Associated Values, Generic,Protocol Extension
//Enum Associated Values 枚舉 和 關(guān)聯(lián)值
enum Trade { 
      case Buy(stock: String, amount: Int) 
      case Sell(stock: String, amount: Int)
}
let trade = Trade.Buy(stock: "APPL", amount: 500)
if case let Trade.Buy(stock, amount) = trade { 
        print("buy \(amount) of \(stock)")
}

Enum深入學(xué)習(xí)-> http://www.tuicool.com/articles/b2YveqQ

//Generic 泛型
//泛型函數(shù)可以適應(yīng)各種類(lèi)型,這個(gè)是泛型版本的swapTwoInts函數(shù),命名為swapTwoValues:
func swapTwoValues<T>(inout a: T, inout b: T) {
         let temporaryA = a
         a = b
         b = temporaryA
     }

Generic深入學(xué)習(xí):http://www.tuicool.com/articles/YbYz6j

//Protocol Extension
protocol ExerciseType: CustomStringConvertible { 
    var name: String { get } 
    var caloriesBurned: Double { get } 
    var minutes: Double { get }
}

// 結(jié)構(gòu)體遵守 ErerciseType 協(xié)議, 但是也可以有自己的屬性和方法, 這也是一種繼承和封裝
struct EllipticalTrainer: ExerciseType { 
    let name = "Elliptical Machine" 
    let caloriesBurned: Double 
    let minutes: Double
}

struct Treadmill: ExerciseType { 
    let name = "Treadmill" 
    let caloriesBurned: Double 
    let minutes: Double 
    let distancesInMiles: Double
}

extension Treadmill { 
    var description: String { 
          return "Treadmill(\(caloriesBurned) calories and \(distancesInMiles) miles in \(minutes) minutes)" 
    }
}

擴(kuò)展學(xué)習(xí):面向協(xié)議編程的WWDC視頻
Session 408: Protocol-Oriented Programming in Swift

3.回調(diào)方式改變
  • success和fail合并到一個(gè)回調(diào)里面(completion)
    (polen:一方面代碼看起來(lái)更舒服,另外進(jìn)行鏈?zhǔn)秸{(diào)用更加可行)
  • 定義了一個(gè)APIResult
  • 參照Alamofire修改接口,把代碼寫(xiě)的更漂亮
enum APIResult<T> { 
    case Success(T) 
    case Failure(NSError, AnyObject?)
}
4.網(wǎng)絡(luò)model改變
  • ObjectMapper代替Mantle
  • Struct 類(lèi)型替換了Class類(lèi)型
  • 盡可能減少optional 類(lèi)型的屬性
    (polen:這個(gè)是真心實(shí)踐出的收貨)
5. 數(shù)據(jù)的處理通用組件
  • 對(duì)數(shù)據(jù)處理過(guò)程的抽象
  • 提供通用函數(shù)作為組件
  • 組件函數(shù)的參數(shù)和返回值符合flatMap參數(shù)定義
6. 其他包括網(wǎng)絡(luò)結(jié)果的鏈?zhǔn)秸{(diào)用等等等等...

這個(gè)App叫Enjoy,很實(shí)在的講了他們一步步修改,一步步完善的經(jīng)歷,踩了很多坑,但是最終也成功走下來(lái)了,總體感覺(jué)作為首場(chǎng)演講,還算不錯(cuò),中規(guī)中矩,都是比較實(shí)用的方法或者技術(shù),相當(dāng)接地氣 ??


《Asynchronous Programming in Swift,Swift異步編程 -- 劉冠杉》

一位阿里音樂(lè)的哥們,講的時(shí)候,我在和旁邊的同學(xué)聊天,很遺憾聽(tīng)?zhēng)拙?br> 他是現(xiàn)場(chǎng)編程講解型的,技術(shù)看著不錯(cuò),但是現(xiàn)場(chǎng)效果貌似不是很好...


逆向:


《逆向工程:從Objective-C到Swift -- 包涵卿》

干貨啊,干貨

自己沒(méi)怎么玩過(guò)逆向,其實(shí)把一個(gè)APP逆向還是比較簡(jiǎn)單的,classdump執(zhí)行幾條命令,基本人家的.h文件你能都看到了
包涵卿這哥們這次將的是,直接對(duì)Swift語(yǔ)言層面的逆向,相對(duì)更深入一些,不過(guò)現(xiàn)場(chǎng)沒(méi)拍照,沒(méi)記錄,除了記得幾個(gè)寄存器,大部分又忘掉了

可能很多人iOS寫(xiě)多了,底層的東西就慢慢忘記了(包括我)
我這里自己簡(jiǎn)單總結(jié)下,
如何快速當(dāng)個(gè)iOS hacker

1.學(xué)習(xí)下xcrun命令

打開(kāi)終端,輸入xcrun clang -v

 xcrun clang -v

屏幕快照 2016-04-27 下午7.23.21.png

如果出現(xiàn)截圖這個(gè)東西
okey,說(shuō)明你已經(jīng)會(huì)了xcrun了,嗯,我們繼續(xù)
補(bǔ)充: 如果有人真要問(wèn)這個(gè)是干嘛,那我告訴你就是xcode run的意思,就是代替了xcode,以后你可以直接用這個(gè)命令打包,編譯...

2.編譯代碼

用vim也好,自己寫(xiě)也好,先新建一個(gè)helloword.c

#include <stdio.h>
int main(int argc,char *argv[]){
    printf("birdies");
    return 1;
}

然后使用我們的xcrun命令,編譯我們的helloword

xcrun clang helloword.c 
屏幕快照 2016-04-27 下午7.49.06.png

3. 學(xué)習(xí)匯編

接著上一步,執(zhí)行如下命令生成匯編代碼

xcrun clang -S -o - helloword.c  | open -f
//以點(diǎn) .開(kāi)頭的行。這些就是匯編指令。其它的則是實(shí)際的 x86_64 匯編代碼

        .section    __TEXT,__text,regular,pure_instructions
        .macosx_version_min 10, 11
        .globl  _main
        .align  4, 0x90
    _main:                                  ## @main
        .cfi_startproc
    ## BB#0:
        pushq   %rbp
    Ltmp0:
        .cfi_def_cfa_offset 16
    Ltmp1:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp2:
        .cfi_def_cfa_register %rbp
        subq    $32, %rsp
        leaq    L_.str(%rip), %rax
        movl    $0, -4(%rbp)
        movl    %edi, -8(%rbp)
        movq    %rsi, -16(%rbp)
        movq    %rax, %rdi
        movb    $0, %al
        callq   _printf
        movl    $1, %ecx
        movl    %eax, -20(%rbp)         ## 4-byte Spill
        movl    %ecx, %eax
        addq    $32, %rsp
        popq    %rbp
        retq
        .cfi_endproc

        .section    __TEXT,__cstring,cstring_literals
    L_.str:                                 ## @.str
        .asciz  "birdies"


    .subsections_via_symbols

來(lái),我們來(lái)分析一下這一段代碼:

/* 以下內(nèi)容是本文最干貨的地方 **/

//以點(diǎn) .開(kāi)頭的行。這些就是匯編指令。其它的則是實(shí)際的 x86_64 匯編代碼

        .section    __TEXT,__text,regular,pure_instructions
        .macosx_version_min 10, 11
        .globl  _main //globl說(shuō)明main是個(gè)外部符號(hào)
        .align  4, 0x90//對(duì)齊方式
//以上是指令,不是匯編代碼,.section 說(shuō)明接下來(lái)要執(zhí)行哪一段

    _main:                                  ## @main
        .cfi_startproc //與cfi_endproc相對(duì)應(yīng),標(biāo)出main函數(shù)開(kāi)始和結(jié)束的地方
    ## BB#0:
//rbp是個(gè)寄存器,ABI會(huì)先把rbp的值存到棧中,回頭用的時(shí)候再取,避免被改掉
//rbp: 基礎(chǔ)指針寄存器(base pointer register)
        pushq   %rbp 

//下面這兩條CFI指令用于輸出一些調(diào)試用的堆棧信息,告訴編譯器一些基礎(chǔ)指針或者堆棧在哪里
    Ltmp0:
        .cfi_def_cfa_offset 16
    Ltmp1:
        .cfi_offset %rbp, -16


//rsp->rbp 把局部變量放到棧上(RSP:堆棧指針,通過(guò)這個(gè)指針存取堆棧存儲(chǔ)器數(shù)據(jù))
        movq    %rsp, %rbp
    Ltmp2:
        .cfi_def_cfa_register %rbp

//將棧指針移動(dòng)32字節(jié),移動(dòng)到函數(shù)會(huì)調(diào)用的地方
        subq    $32, %rsp

//printf()函數(shù)調(diào)用, rax是個(gè)累加器,leaq會(huì)將 L_.str的指針加載到 rax寄存器中。
        leaq    L_.str(%rip), %rax
        movl    $0, -4(%rbp)
        movl    %edi, -8(%rbp)
        movq    %rsi, -16(%rbp)
        movq    %rax, %rdi
        movb    $0, %al
        callq   _printf
        movl    $1, %ecx
        movl    %eax, -20(%rbp)         ## 4-byte Spill
        movl    %ecx, %eax
        addq    $32, %rsp
        popq    %rbp
        retq
        .cfi_endproc

        .section    __TEXT,__cstring,cstring_literals
    L_.str:                                 ## @.str
        .asciz  "birdies"


    .subsections_via_symbols

關(guān)于這個(gè)的詳細(xì)分析在這里
https://www.objc.io/issues/6-build-tools/mach-o-executables/
http://objccn.io/issue-6-3/

擴(kuò)展:
iOS程序main函數(shù)之前發(fā)生了什么
http://blog.sunnyxx.com/2014/08/30/objc-pre-main/

2016-04-28 00:48:20 先寫(xiě)到這,明天要發(fā)版本,后面慢慢補(bǔ)充...


語(yǔ)言層面:


《擁抱Swift3.0與未來(lái)展望 -- 圖拉鼎》
《Swift語(yǔ)言的設(shè)計(jì)取舍及跨語(yǔ)言調(diào)用 -- 董一凡》

函數(shù)式編程:


《從數(shù)學(xué)函數(shù)角度理解函數(shù)式編程 -- 丁峰》
《讀Swift源碼,理解Monad -- 唐巧》
《How to parse float numbers-the really hard way -- 傅若愚》

《Objective-C和Swift的跨平臺(tái)開(kāi)發(fā) -- Tinyfool》


《Swift設(shè)計(jì)模式 -- 老鎮(zhèn)》
《Redux in Swift——新一代的iOS應(yīng)用架構(gòu) -- 方志剛》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容