來自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 次就顯示一個動作。
uj5u.com熱心網友回復:
不幸的是,提供的回復都沒有給出正確的答案,我已經找到了解決方案。
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
}
uj5u.com熱心網友回復:
您可能希望在這里使用完全不同的方法,例如捆綁一個 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
}
}
}
uj5u.com熱心網友回復:
現在它是一個可以用 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
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/329185.html
