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] = [:]//dictionry
(3)發現,1、即使model中漏寫了某些引數也沒有關係,不會crash
2、多寫了也沒事。不會crash