swift開發中那些值得借鑑的寫法

寫在前面

最近在學習swift,從github上下載不少demo進行學習,收穫不小,發現了一些不錯的寫法,記錄一下方便之後查詢,同時分享給你們,共同成長。git

UI相關的一些常量和輔助方法

如下代碼主要定義了一個swift工程中的UI部分的常量亮和定義,固然,這只是demo,正式工程能夠按照這個思路進行擴展。
一個XYUI結構體囊括了ScreenColorFont三個子結構體,分別定義了屏幕、顏色、字體相關的常量和方法,結構清晰,方便後續擴展。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)
    }
}

關於cellIdentifier使用

關於tableviewcollectionViewcellIdentifier定義,在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自適應。如下是以iPhone6iPhone6s的屏幕尺寸爲基準進行縮放的方法,特別收錄一下。字體

// 寬度比
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")
}

利用擴展把通知名定義成常量,方便後續的調用。

相關文章
相關標籤/搜索