我正在将代码从Objective迁移到SWIFT4.0。这里,我在特定的Objective头类中有一些与我的deviceHeight相关的浮点#定义常量。访问此#时,请定义授予错误"Use of unresolved identifier"。当我使用Objective字符串#定义标识符时,它很容易在Swift类中访问。
在Swift4中无法访问
#定义PHONE_IPHONE10 PHONE_UISCREEN_HEIGHT==812.0f
在Swift4中可访问
#define @“发生了一些错误。请稍后再试”。
帮助我提出你的意见或解决方案。
发布于 2018-03-26 04:44:58
这是从斯威夫特进口的原因。
#define @“发生了一些错误,请稍后再试。”
...is表示它在语义上等同于常量声明。也就是说,它将字符串-文字值与名称ERROR永久关联。Swift编译器认识到您正在使用C预处理器定义一个常量,并将其转换为Swift常量。
(尽管您可以(而且可能应该)在没有预处理器的情况下定义C全局常量,但Swift认识到使用#define有着悠久的传统,因此无论如何都要导入它。
这不重要的原因是斯威夫特。
#定义PHONE_IPHONE10 PHONE_UISCREEN_HEIGHT==812.0f
...is表示这是一个预处理宏。它不会静态地将名称映射到值。相反,它告诉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或行为的整个想法都充满了危险。试过自动布局?
发布于 2018-03-22 07:08:08
为了实现类似的功能,我使用以下结构创建了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中的类型安全,您可以阅读这里。
https://stackoverflow.com/questions/49422358
复制相似问题