首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Objective浮点#定义在Swift4中不可访问

Objective浮点#定义在Swift4中不可访问
EN

Stack Overflow用户
提问于 2018-03-22 06:56:16
回答 2查看 146关注 0票数 2

我正在将代码从Objective迁移到SWIFT4.0。这里,我在特定的Objective头类中有一些与我的deviceHeight相关的浮点#定义常量。访问此#时,请定义授予错误"Use of unresolved identifier"。当我使用Objective字符串#定义标识符时,它很容易在Swift类中访问。

在Swift4中无法访问

#定义PHONE_IPHONE10 PHONE_UISCREEN_HEIGHT==812.0f

在Swift4中可访问

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

帮助我提出你的意见或解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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中,这种逻辑的惯用方法是作为类型上的静态成员,而不是全局符号)。就像这样:

代码语言:javascript
复制
extension UIDevice {
    class var isMaybeiPhoneX: Bool {
        return false // or some logic based on UIScreen.main.size
    }
}

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

票数 1
EN

Stack Overflow用户

发布于 2018-03-22 07:08:08

为了实现类似的功能,我使用以下结构创建了Constants.swift文件:

代码语言:javascript
复制
struct Constants {
    struct phoneHeights {
        static let PHONE_UISCREEN_HEIGHT = 812.0
        //some others consts
    }

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

或者简单地说:

代码语言:javascript
复制
struct Constants {
    static let PHONE_UISCREEN_HEIGHT = 812.0
    static let statusBarHeight: CGFloat = 44
}

为了确保Swift中的类型安全,您可以阅读这里

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49422358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档