最近在學習swift,從github上下載不少demo進行學習,收穫不小,發現了一些不錯的寫法,記錄一下方便之後查詢,同時分享給你們,共同成長。git
如下代碼主要定義了一個swift工程中的UI部分的常量亮和定義,固然,這只是demo,正式工程能夠按照這個思路進行擴展。
一個XYUI結構體囊括了Screen
、Color
、Font
三個子結構體,分別定義了屏幕、顏色、字體相關的常量和方法,結構清晰,方便後續擴展。github
struct XYUI { struct Screen { static let Width : CGFloat = UIScreen.main.bounds.width static let Height : CGFloat = UIScreen.main.bounds.size.height static let NavH : CGFloat = XYUI.Screen.IphoneX == true ? 88 : 64 static let StatusbarH : CGFloat = XYUI.Screen.IphoneX == true ? 44 : 20 static let IphoneX: Bool = Int(XYUI.Screen.Height/XYUI.Screen.Width) == 216 //判斷是不是iPhoneX序列 } // 顏色 struct Color { /// 主色調 static let primary = UIColor.hexString(color: "#FFCA07") static let black = UIColor.hexString(color: "#333333") static let white = UIColor.white } struct Font { static func fitFont(size:CGFloat) -> CGFloat { if UIScreen.main.bounds.size.width == 320 { return size * 0.8 } return size } static let f10 = UIFont.systemFont(ofSize: 10) static let f11 = UIFont.systemFont(ofSize: 11) static let f12 = UIFont.systemFont(ofSize: 12) static let f13 = UIFont.systemFont(ofSize: 13) static let f14 = UIFont.systemFont(ofSize: 14) static let f15 = UIFont.systemFont(ofSize: 15) static let f16 = UIFont.systemFont(ofSize: 16) static let f17 = UIFont.systemFont(ofSize: 17) static let f18 = UIFont.systemFont(ofSize: 18) static let f20 = UIFont.systemFont(ofSize: 20) } }
關於tableview和collectionView的cellIdentifier定義,在objective-c中,我以前是這樣定義的:objective-c
static const NSString *kXXXIdentifier = @"XXXIdentifier"; //XXX換成對應cell的類名
後來發現了一個更簡便的寫法,就是在對應的cell中,定義一個類方法,在類方法中使用反射機制進行類名的獲取,從而生成複用標識。代碼以下:swift
+ (NSString *)cellIdentifier{ return NSStringFromClass([self class]); }
這樣就不用絞盡腦汁去想複用標識的常量名了,並且更爲簡潔。ide
在swift中一般的作法和在objective-c中同樣,定義一個常量,函數
static let kXXXIdentifier: String = "XXXIdentifier"; //XXX換成對應cell的類名
更爲簡潔的寫法:佈局
public class func identifier() -> String { let name: AnyClass! = object_getClass(self) return NSStringFromClass(name) }
從代碼上看,無論是objective-c仍是swift,使用反射獲取的cellIdentifier和對應的cell綁定在一塊兒,不只能夠直接進行代碼的copy複用,並且免去了在絞盡腦汁想複用標識常量名的麻煩,何樂爲不爲呢。學習
咱們開發中進行UI佈局的時候,即便採用的是自動佈局,一些控件的尺寸、控件間的間距也是應該按照屏幕的大小進行縮放的,這樣才能作到標準的UI自適應。如下是以iPhone6、iPhone6s的屏幕尺寸爲基準進行縮放的方法,特別收錄一下。字體
// 寬度比 let kWidthRatio = kScreenW / 375.0 //iPhone六、iPhone6s的寬度爲基準 // 高度比 let kHeightRatio = kScreenH / 667.0 //iPhone六、iPhone6s的高度爲基準 // 按比例自適應 func Adapt(_ value : CGFloat) -> CGFloat { return AdaptW(value) } // 自適應寬度 func AdaptW(_ value : CGFloat) -> CGFloat { return ceil(value) * kWidthRatio } // 自適應高度 func AdaptH(_ value : CGFloat) -> CGFloat { return ceil(value) * kHeightRatio }
ceil函數從網上查了一下,意思是向上取整。ui
iOS開發中,通知也是咱們常常使用的觀察者模式的一種實現。在OC中,咱們一般把通知名定義成一個全局的常量,這樣方便調用和修改。
在OC中,咱們以前是這樣作定義的:
NotificationGlobalName.h
extern NSString *const buildRouteNotification; extern NSString *const placeDeletedNotification; extern NSString *const centerPlaceOnMapNotification;
NotificationGlobalName.m
//`XXX`替換成工程名 NSString *const buildRouteNotification = @"XXX.buildRouteNotification"; NSString *const placeDeletedNotification = @"XXX.placeDeletedNotification"; NSString *const centerPlaceOnMapNotification = @"XXX.centerPlaceOnMapNotification";
咱們能夠在內部使用#pragma mark -模塊名
分模塊定義,這樣方便後續的更新和查找。
swift中咱們能夠這樣作:
extension Notification.Name { static let buildRoute = Notification.Name("buildRouteNotification") static let placeDeleted = Notification.Name("placeDeletedNotification") static let centerPlaceOnMap = Notification.Name("centerPlaceOnMapNotification") }
利用擴展把通知名定義成常量,方便後續的調用。