首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保持NSUserActivity向后兼容Xcode9

保持NSUserActivity向后兼容Xcode9
EN

Stack Overflow用户
提问于 2018-08-31 23:10:30
回答 2查看 617关注 0票数 1

使用Xcode10(测试版6),我可以毫不费力地编写和运行以下代码:

代码语言:javascript
复制
import Intents

func test() {

    let activity = NSUserActivity(activityType: "com.activtiy.type")

    activity.title = "Hello World"
    activity.isEligibleForSearch = true
    activity.isEligibleForHandoff = false

    if #available(iOS 12.0, *) {
        activity.isEligibleForPrediction = true
        activity.suggestedInvocationPhrase = "Say something"
    }

    print(activity)
}

从iOS 12开始,已经添加了.isEligibleForPredictions.suggestedInvocationPhrase属性,因此Xcode10可以使用if #available条件保持代码本身的向后兼容性。

但是,我希望确保此代码向后兼容早期版本的Xcode。当在Xcode 9中运行时,我得到以下错误:

代码语言:javascript
复制
if #available(iOS 12.0, *) {
        // ERROR: Value of type 'NSUserActivity' has no member 'isEligibleForPrediction'
        activity.isEligibleForPrediction = true

        // ERROR: Value of type 'NSUserActivity' has no member 'suggestedInvocationPhrase'
        activity.suggestedInvocationPhrase = "Say something"
    }

这似乎是因为#available宏实际上是在运行时解析的,因此仍然需要成功编译包含的所有代码。

有没有办法让编译器在为iOS 11构建或使用Xcode9时忽略这两行代码?

EN

回答 2

Stack Overflow用户

发布于 2018-09-02 02:17:40

Xcode 10使用Swift 4.2,而Xcode 9使用Swift 4.1。因此您可以在编译时使用这些知识:

代码语言:javascript
复制
func test() {
    let activity = NSUserActivity(activityType: "com.activtiy.type")

    activity.title = "Hello World"
    activity.isEligibleForSearch = true
    activity.isEligibleForHandoff = false

    #if swift(>=4.2) // compile-time check
    if #available(iOS 12.0, *) { // run-time check
        activity.isEligibleForPrediction = true
        activity.suggestedInvocationPhrase = "Say something"
        predictionApiAvailable = true
    }
    #endif

    print(activity)
}

(此答案假设您在Xcode 10上使用Swift 4.2。)

票数 1
EN

Stack Overflow用户

发布于 2018-09-03 19:30:13

您所使用的可用性条件(如果#available)是在运行时评估的,但编译器将使用此信息来提供编译时安全性(如果您正在调用的API不存在于部署目标中,它将警告您)。

要有条件地编译代码,必须使用Conditional Compilation Block

代码语言:javascript
复制
#if compilation condition
statements
#endif

要有条件地基于Xcode版本构建代码,可以在构建设置( -D快速编译标志)中包含一个活动的编译条件,该条件的名称是基于Xcode版本动态创建的。然后将其用作编译条件。Xcode已经提供了构建设置XCODE_VERSION_MAJOR,它可以解析到当前的Xcode版本(例如,Xcode9的0900 )。因此,您可以添加一个名为XCODE_VERSION_$(XCODE_VERSION_MAJOR)的活动编译条件,该条件将解析为Xcode9的标志XCODE_VERSION_0900。

然后,您可以使用以下命令有条件地编译您的代码:

代码语言:javascript
复制
#if XCODE_VERSION_0900
statements
#endif

我有一个示例项目here

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

https://stackoverflow.com/questions/52118357

复制
相关文章

相似问题

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