我的#if TARGET_OS_SIMULATOR代码对于Realm路径定义有什么问题?

时间:2016-03-23 14:17:13

标签: swift realm

我有这段代码

 #if TARGET_OS_SIMULATOR
let device = false
let RealmDB = try! Realm(path: "/Users/Admin/Desktop/realm/Realm.realm")
#else
let device = true
let RealmDB = try! Realm()
#endif

设备bool工作正常,但RealmDB仅适用于其他条件。

4 个答案:

答案 0 :(得分:24)

从Xcode 9.3+开始,Swift现在支持if #targetEnvironment(simulator)来检查你是否正在为模拟器构建。

请停止使用架构作为模拟器的快捷方式。 macOS和模拟器都是x86_64,可能不是你想要的。

// ObjC/C:
#if TARGET_OS_SIMULATOR
    // for sim only
#else
    // for device
#endif


// Swift:
#if targetEnvironment(simulator)
    // for sim only
#else
    // for device
#endif

答案 1 :(得分:11)

TARGET_IPHONE_SIMULATOR宏在Swift中不起作用。 你想做的就像下面这样,对吧?

#if arch(i386) || arch(x86_64)
let device = false
let RealmDB = try! Realm(path: "/Users/Admin/Desktop/realm/Realm.realm")
#else
let device = true
let RealmDB = try! Realm()
#endif

答案 2 :(得分:6)

请看这篇文章。这是正确的方法,并且很好地解释了

https://samsymons.com/blog/detecting-simulator-builds-in-swift/

基本上定义一个名为你喜欢的变量(可能是' SIMULATOR'),在模拟器中运行时设置。 在目标的构建设置中,在Active Compilation Conditions - >下设置它Debug然后(+)然后在下拉列表中选择Any iOS Simulator SDK,然后添加变量。

然后在你的代码中

var isSimulated = false
#if SIMULATOR
  isSimulated = true // or your code
#endif

答案 3 :(得分:0)

有关此问题的更多说明是here。 我正在使用this方法:

struct Platform {
        static let isSimulator: Bool = {
            var isSim = false
            #if arch(i386) || arch(x86_64)
                isSim = true
            #endif
            return isSim
        }()
    }

    // Elsewhere...

    if Platform.isSimulator {
        // Do one thing
    }
    else {
        // Do the other
    }

或者创建一个实用程序类:

class SimulatorUtility
{

    class var isRunningSimulator: Bool
    {
        get
        {
             return TARGET_OS_SIMULATOR != 0// for Xcode 7
        }
    }
}