1. 程式人生 > >swift4 在專案中的使用Tips(一)

swift4 在專案中的使用Tips(一)

前言:還記得是去年還會用swift寫了一個app,如今在用Xcode9 開啟,一片紅呀,也run不起來了。很多語法都變了。淡淡的憂傷~~也是好長時間沒寫了,很多用法都忘記了。如今,計劃重新寫一個當前專案的swift版本,也是練練手。記錄下常用的。

1、我們從後取值時,在不能確定該值是否存在時,需要 if let 下
eg:

if let count = model.auctionCount {
reserveCountLabel.text = String.init(format: “目前該產品預訂人數:%d”, count)
}

2、我們在oc中使用MJExtension來將字典陣列轉模型陣列,或者模型轉字典,其中型別全部寫成NSString型別都是可以的,等到用的時候再進行轉換,得到的結果值也是準確的。但是在swift中,用ObjectMapper來轉換時,必須將關鍵字的型別寫準確,否則轉換後的結果是空,或者不對的。我們可以在介面返回資料時,打斷點,然後滑鼠放在dic上會顯示返回的陣列及型別都可以看到的
這裡寫圖片描述

3、在oc中我們的圖片不存在,頁面就是顯示空白,而在swift中,則是會crash,為了防止,忘記將圖片拖入,我們在給ImageView設定圖片時,可以先判斷下,可以給個預設圖片,注意這不是從網路上獲取圖片的

ImageView.image = [UIImage imageName:@”xxx”];
swift中給UIImage寫個extension

static func ycf_imgWithName(name: String) -> UIImage {
        let img = UIImage(named:  name)

        if img == nil {
            return UIImage.ycf_placeholderImg()
        }
        return img!
    }

4、有些func 返回值可能是nil,比如返回UIImageview的 ,應該這樣寫

func xxxx:(引數) -> UIImageView ? {
}

5、我們在oc中使用tag獲取UIButton

UIButton btn = (UIButton )[self.view viewWithTag:325];
在swift中我們這樣:
let btn: UIButton = self.view.viewWithTag(325) as! UIButton

6、在使用UICollectionViewCell時,不要將相關的view新增到self.contentView上去。直接新增到self上即可。不然有些圖片顯示會有問題

7、有些資料它的型別時Int64,我們在顯示該資料時

var marketNumber: Int64!//商品編號
String(model.marketNumber) //此時我們是確定該marketNumber值肯定存在,直接這樣顯示是ok的
……
var auctionCount: Int64? //對於這種不確定的值,該如何取值呢

if let count = dic["auctionCount"] as? NSNumber {
    self.model.auctionCount = Int64(truncating: count)
 }

8、關於Bool值的

 let result = dic["result"] as! Bool

  if  result {
      //.....
  }else{
     // ....
  }

9、關於介面返回的資料,我們使用的是陣列

//1、初始化
private var dataArray: Array<GoodsListModel> = Array.init()

//2、處理資料
 let dic: NSDictionary = response as! NSDictionary
 let list: [[String : Any]] = dic["data"] as! [[String : Any]]
 if list.count != 0  {
        let arr : Array<GoodsListModel> = Mapper<GoodsListModel>().mapArray(JSONArray: list)
        self.dataArray.append(contentsOf: arr)
      }

10、json 轉字典

一、方法一:
 let userModel = Mapper<UserModel>().map(JSON: StaticFunction.getUserDefaultObject(CURRENT_USER_KEY) as! [String : Any])

 let clientModel = Mapper <ClientManagementModel>().map(dic);

方法二:
let model = LoginViewModel(JSON: response as! [String : Any])

字典陣列轉為模型陣列
let users:[UserModel] = Mapper<UserModel>().mapArray(JSONArray:userArray)

11、在Mappable中

1)關於陣列的寫法,有如下兩種,當然也可以將陣列繼續寫成model
var mainResList: [AnyObject]?
var customResList: Array<Any>?

var user: UserModel?//使用者物件2)字典的寫法
var dic: [String :AnyObject] = [:]//dictionry3)發現,1、即使model中漏寫了某些引數也沒有關係,不會crash
            2、多寫了也沒事。不會crash