Objective c 目标-C浮动#定义在Swift4中不可访问

Objective c 目标-C浮动#定义在Swift4中不可访问,objective-c,swift4,Objective C,Swift4,我正在将代码从Objective-C迁移到Swift 4.0。这里我有一些float#define常量,与特定Objective-C头类中的deviceHeight相关。访问此#定义给定错误“未解析标识符的使用”。当我使用Objective-C字符串#define identifier时,它在Swift类中很容易访问 在Swift4中无法访问 #定义手机(IPHONE10手机)屏幕高度==812.0f 可在Swift4中访问 #定义错误@“出现了一些错误。请稍后再试。” 请帮助我提供您的意见或解

我正在将代码从Objective-C迁移到Swift 4.0。这里我有一些float#define常量,与特定Objective-C头类中的deviceHeight相关。访问此#定义给定错误
“未解析标识符的使用”
。当我使用Objective-C字符串#define identifier时,它在Swift类中很容易访问

在Swift4中无法访问

#定义手机(IPHONE10手机)屏幕高度==812.0f

可在Swift4中访问

#定义错误@“出现了一些错误。请稍后再试。”


请帮助我提供您的意见或解决方案

为了实现类似的功能,我使用以下结构创建了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中的类型安全,您可以阅读。

此导入Swift的原因

#定义错误@“发生了一些错误。请稍后再试。”

…它在语义上等同于一个常量声明。也就是说,它将该字符串文本值与名称
ERROR
永久关联。Swift编译器识别您正在使用C预处理器定义一个常量,并将其转换为Swift常量

(尽管您可以而且可能应该在不使用预处理器的情况下定义C全局常量,但Swift认识到使用
#define
有着悠久的传统,并且无论如何都会导入它。)


这对Swift不重要的原因是

#定义手机\ iPhone 10手机\屏幕\高度==812.0f

…这是一个预处理器宏。它不会静态地将名称映射到值。相反,它告诉C,无论它在哪里看到你的名字
PHONE\u IPHONE10
,它都应该用表达式
PHONE\u UISCREEN\u HEIGHT==812.0f
。大概
PHONE\u UISCREEN\u HEIGHT
本身就是一个宏,所以整个过程扩展为一系列方法调用和相等比较

Swift本身不做预处理器宏或类似的东西,所以它不从C导入它们

类似的做法是使用计算属性或函数重新定义此逻辑(在Swift中,这样做的惯用方法是作为类型上的静态成员,而不是全局符号)。大概是这样的:

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

但请注意,基于特定屏幕高度检查有条件地更改应用程序的UI或行为的整个想法充满了危险。尝试自动布局?

为什么不使用常量?将
#define
更改为常量很容易:
静态CGFloat const PHONE\u IPHONE10 PHONE\u UISCREEN\u HEIGHT=812
然后您还可以使用
swift
中的consts获取您也可以编程实现的手机屏幕。但为什么斯威夫特限制浮动而不是字符串#define?因为这很危险。想象一下这种情况:
#define aa=10
那么代码中的某个地方可能是
让anotherVar=“small value”
另一个变量将是
sm10ll value
我希望我在Swift 4.2或5中得到这个解决方案…:不,你不会,因为Swift是安全的(如果我们谈论类型),这与上面的宏不同。上面的宏是一个比较,而不是赋值。如果原始代码是
#define PHONE\u UISCREEN\u HEIGHT 812.0f
@uliwitness Yes,那么您的答案是正确的,因此我写了“类似的功能”