在 swift 中禁用旧模拟器的一大块代码?

问题描述 投票:0回答:1

我收到“请求审核”提醒:

SKStoreReviewController.requestReview(in: scene)

问题是它挂起了 iPhone 15.x 模拟器,所以我决定禁用它。

但是还有一个问题——模拟器的禁用是通过宏来实现的:

#if !targetEnvironment(simulator)
   ...
#endif

并且对特定 iOS 版本的禁用是通过属性

@available
#available
实现的。

如何将宏与这些属性结合起来?或者有更方便的方法来实现这一点吗?

我当前的代码是:

#if targetEnvironment(simulator)
        if #available(iOS 16, *) {
            SKStoreReviewController.requestReview(in: scene)
        }
#else
        SKStoreReviewController.requestReview(in: scene)
#endif
ios swift attributes ios-simulator swift-macro
1个回答
0
投票

您始终可以编写自己的全局变量来包装这些“宏”(从技术上讲,它们不是宏)。

var isSimulator: Bool {
    #if targetEnvironment(simulator)
        true
    #else
         false
    #endif
}

var ios16Available: Bool {
    if #available(iOS 16, *) {
        true
    } else {
        false
    }
}

那么你可以做

if ios16Available || !isSimulator {
    SKStoreReviewController.requestReview(in: scene)
}

如果你可以接受一个空的 if 语句,你可以避免声明

ios16Available
(我觉得这很可怕):

if #unavailable(iOS 16), isSimulator {} else {
    SKStoreReviewController.requestReview(in: scene)
}

如果可以立即返回,则

guard
效果完美:

guard #unavailable(iOS 16), isSimulator else {
    SKStoreReviewController.requestReview(in: scene)
    return
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.