[英]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.