每次按下“x”按钮执行操作的 Swift 等效项

Posted

技术标签:

【中文标题】每次按下“x”按钮执行操作的 Swift 等效项【英文标题】:Swift equivelent for every 'x' press of button to perform action 【发布时间】:2021-09-28 09:24:57 【问题描述】:

来自objective-C 背景并慢慢进入Swift,我可以使用let 而不是#define 但是如何将这个语句从objective-C 翻译成swift

#define ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY 5 将变为 let ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY = 5

但是,我们如何将下面的内容翻译成swift?

#ifdef ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSInteger nb_shown_lobby = [prefs integerForKey:@"nShownLobby"];
nb_shown_lobby++;
[prefs setInteger:nb_shown_lobby forKey:@"nShownLobby"];
[prefs synchronize];

if ((nb_shown_lobby % ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY) == 0) 
  
   //My Method goes here
    


#endif

上述方法的最终结果是基本上每按5次就显示一个动作。

【问题讨论】:

【参考方案1】:

很遗憾,所提供的回复都没有给出正确的答案,我已经找到了解决方案。

let ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY = 5
                   
                    let prefs = UserDefaults.standard
                    var nb_shown_lobby = prefs.integer(forKey: "nShownLobby")
                    nb_shown_lobby += 1
                    prefs.set(nb_shown_lobby, forKey: "nShownLobby")
                    prefs.synchronize()

                    if (nb_shown_lobby % ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY) == 0 
                        //Do your method here
                    

【讨论】:

不太一样,因为除非定义了常量,否则 Objective-C 代码不会执行,而 Swift 代码将始终执行。【参考方案2】:

您可能希望在此处使用完全不同的方法,例如捆绑一个 plist 文件,告诉您的应用程序启用哪些功能以及跳过哪些功能。这将是一个运行时检查,但并没有那么糟糕。

另一种方法是引入一个带有功能标志的结构并在每个目标的基础上编译正确的配置,即:

/// FeatureFlagsAbstract.swift
protocol FeatureFlags 
    static var myFeature: Int?  get 


/// Target A/Features.swift
struct MyFeatureFlags: FeatureFlags 
    static var myFeature: Int? 
        return 5
    


/// Target B/Features.swift
struct MyFeatureFlags: FeatureFlags 
    static var myFeature: Int? 
        return nil
    



/// Class.swift
class MyClass 
    func doSomething() 
       if let value = MyFeatureFlags.myFeature 
          // branch that uses some feature
       
    


【讨论】:

嗨 Rob,不幸的是,在使用第一个示例时(这似乎比后一个代码更符合我的需求)我遇到了一个错误 Expected '&&' or '||' expression 那是我使用这个 #if ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY > 0 // Do something #endif 时跨度> @DannyRoy 你是对的。看起来 swift 将预编译器变量视为布尔标志。无论哪种方式,我的答案的第二部分仍然成立。【参考方案3】:

现在它是一个 swift 常量,可以用 swift 代码处理:

if ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY > 0  // equivalent to ifdef 
…
 // équivalent to endif 

为未定义的 ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY 将其值设置为 0

如果值 0 可以在其他上下文中使用,您可以使用可选整数:

// let ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY : Int? = 5 
// -> is equivalent to #define myMacro 5
// let ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY : Int? = nil 
// is equivalent to not defining the macro 
// uncomment the line according to what you want to achieve 

usage :

if let _ = ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY 
    …
    if ((nb_shown_lobby % ADS_INTERSTITIAL_ON_LOBBY_FREQUENCY!) == 0) 

   //My Method goes here
    

    

【讨论】:

是 Java 吗? ...... @RobZombie :不,它很快 这段代码产生了几个错误@PtitXav 你能告诉我吗?我正在从应用程序中编写,并且没有使用 Xcode 测试的 mac。

以上是关于每次按下“x”按钮执行操作的 Swift 等效项的主要内容,如果未能解决你的问题,请参考以下文章

按下 UINavigationController 的后退栏按钮时执行操作

按下UINavigationController的后退按钮时执行操作

按下时将按钮分组以执行相同的操作

在swift3中按下按钮时如何以编程方式执行segue或呈现视图

DoEvents 等效于 C++?

Swift:监听 iOS 设备上的物理按钮向上/向下事件