1. 程式人生 > >oc swift混編實踐問題總結

oc swift混編實踐問題總結

        swift已經慢慢變得越來越讓人喜歡了。所以,我們團隊開始嘗試探索把我們龐大的專案實現oc和swift的混編。至於為什麼不直接重構,那是因為實在是時間和事實不允許,畢竟我們的APP已經是好幾年的龐然大物了。

        言歸正傳,我開始嘗試著用swift來重寫一個oc頁面,看看難度如何,先趟趟坑再說。下面就是我自己遇到的一些小坑,總結如下。(純程式碼開發,swift3.0)

1,關於橋接標頭檔案的問題

      橋接標頭檔案用來聯絡swift和oc檔案,使swift能夠呼叫oc的類,起到一個橋樑作用。

我們只需要在裡面用  #import  包含需要用到的oc檔案即可。比如:一個包含很多基礎類的全域性檔案(#import "Define.h")、一些需要的第三方類庫的標頭檔案(#import "MJRefresh.h",#import "MJRefreshComponent.h")、一個你自己用oc定義的cell類、一個需要從當前頁面跳入到的下一個oc類頁面等。

2,oc中的巨集定義在swift中怎麼用

      最開始我也想怎麼讓它能在swift中直接呼叫的。可事實證明是行不通的。解決方法就是建立一個 import Foundation 的 swift檔案,如下圖:

    

包括一些色值巨集定義、網路是否連線巨集定義、toast提示巨集定義等。當然,也包括介面巨集定義。寫完之後就可以在其他swift檔案中直接用了,有點像oc裡面那個pch檔案。

       這是我覺得比較麻煩的一些地方,如果以後工程都用oc寫的話,那辣麼長辣麼長的巨集定義都要用swift重新定義一遍,而且名字最好還是有點區別。。想想就很麻煩。

3,swift檔案初始化的問題
      開始先包含UIkit,然後在class 類名:“繼承的父類”,“代理類” { 全部程式碼實現}

主題裡面首先要寫兩個方法:


這兩個方法是必須的,不然會報一些亂七八糟的錯誤。init方法裡面初始化在init外面定義的屬性(不論是let or var),當然也可以在定義時就初始化。但是需要注意的一點就是必須在super.init之前初始化。具體更詳細的內容請看官網:The Swift Programming Language (Swift 3): Initialization

        swift的初始化問題還是有點意思的。

4,oc中怎麼呼叫swift的類

        這個地方有兩個小坑。首先,我們要在需要呼叫swift的類的地方包含#import "CaissaTouristic-Swift.h",這個是swift自動生成的一個檔案,具體格式是:"本專案工程名-Swift.h",然後在需要的地方用你的swift檔案類名呼叫就行了。

        我如果想用類名獲取類怎麼辦呢,就像在oc裡面一樣。其實寫法跟oc是一樣的,只不過要在類名前面加個 "本專案工程名.",具體格式如:@"CaissaTouristic.SHolidayOrderListViewC"。

CaissaTouristic是我的專案名,SHolidayOrderListViewC是我的swift類名。

5,網路請求問題 json

因為我在基礎類中已經包含了afnetworking和jsonkit類,所以可以直接拿來用,語法什麼swift已經自行轉變。網路請求直接用方法就行了,需要注意的一點是我用jsonString轉換拼接引數(字典)的時候,提示我請求引數缺失,明明裡面是有值的。打印出來是這個樣子的:


又帶optional又帶\的,肯定不對。至於為什麼帶optional,請戳這裡。那怎樣去掉optional呢?

解決辦法就是後面加!強制解包,即:args.jsonString()!,args是我的引數字典。

6,一些程式碼小問題()

      1,frame的初始化由cgrectmake(:::)變成了cgrect(x:y:width:height:)

      2,@selecter變成#selector

      3,注意 ?和 ! 的用法,感覺也是一個小宇宙,另開篇詳寫。

      4,錯誤提示expression resolves to an unused function

      如圖,是我在用mj做列表上拉載入的時候呼叫結束重新整理的方法,提示此錯誤

        原因分析:從字面就可以看出,它提示的錯誤資訊是表示式返回的是一個沒有使用的函式,我們只是簡單的呼叫了它。這就是swift與oc不同的一點,swift要求使用 . 來呼叫方法,且方法名後邊是必須加()的,同時這也是屬性和方法的一點直觀區別。

         解決方法:

        self.mainTableView.footer.endRefreshing()

       對於swift中的設計模式問題還沒有做太多關注,這篇筆記只是記錄在工程基本的寫法和語法方面的一些實際小問題。