簡體   English   中英

在Swift4中無法訪問Objective-C float #define

[英]Objective-C float #define not accessible in Swift4

我正在將代碼從Objective-C遷移到Swift 4.0。 在這里,我在特定Objective-C標頭類中有一些與我的deviceHeight相關的float #define常數。 訪問此#define時出現錯誤"Use of unresolved identifier" 當我使用Objective-C字符串#define標識符時,可以在Swift類中輕松訪問它。

在Swift4中無法訪問

#定義PHONE_IPHONE10 PHONE_UISCREEN_HEIGHT == 812.0f

在Swift4中可訪問

#define錯誤@“發生某些錯誤。請稍后再試。”

幫助我提出您的意見或解決方案。

導入Swift的原因...

#define錯誤@“發生某些錯誤。請稍后再試。”

...在語義上等同於常量聲明。 也就是說,它將該字符串文字值與名稱ERROR永久關聯。 Swift編譯器識別出您正在使用C預處理器定義常量,並將其轉換為Swift常量。

(即使您可以(並且可能應該)在不使用預處理程序的情況下定義C全局常量,Swift仍認為使用#define來代替它並導入它一直存在悠久的傳統。)


無法導入Swift的原因...

#定義PHONE_IPHONE10 PHONE_UISCREEN_HEIGHT == 812.0f

...這是一個預處理器 它不會將名稱靜態映射到值。 相反,它告訴C在任何地方看到您的名字PHONE_IPHONE10 ,都應替換表達式 PHONE_UISCREEN_HEIGHT==812.0f 大概PHONE_UISCREEN_HEIGHT本身就是一個宏,因此整個過程擴展為方法調用和相等性比較的鏈。

Swift本身不執行預處理器宏或類似的操作,因此不會從C導入它們。

一種近似的等效方法是使用計算的屬性或函數重新定義此邏輯(在Swift中,慣用的方法是將其作為類型的靜態成員,而不是全局符號)。 像這樣:

extension UIDevice {
    class var isMaybeiPhoneX: Bool {
        return false // or some logic based on UIScreen.main.size
    }
}

但請注意,基於特定的屏幕高度檢查有條件地更改應用程序的UI或行為的整個想法充滿了危險。 嘗試過自動版式?

為了實現類似的功能,我使用以下結構創建了Constants.swift文件:

struct Constants {
    struct phoneHeights {
        static let PHONE_UISCREEN_HEIGHT = 812.0
        //some others consts
    }

    struct iPhoneX {
        static let statusBarHeight: CGFloat = 44
        //some others consts
    }
}

或者簡單地:

struct Constants {
    static let PHONE_UISCREEN_HEIGHT = 812.0
    static let statusBarHeight: CGFloat = 44
}

為了確保Swift中的類型安全,您可以在此處閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM