What's wrong with my #if TARGET_OS_SIMULATOR code for Realm path definition?

我怕爱的太早我们不能终老 提交于 2019-11-30 23:15:24

问题


I have this code

 #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

device bool works fine, yet RealmDB works only for else condition.


回答1:


TARGET_IPHONE_SIMULATOR macro doesn't work in Swift. What you want to do is like the following, right?

#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:


As of Xcode 9.3+ Swift now supports if #targetEnvironment(simulator) to check if you're building for Simulator.

Please stop using architecture as a shortcut for simulator. Both macOS and the Simulator are x86_64 which might not be what you want.

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


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



回答3:


Please see this post. This is the correct way to do it and it's well explained

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

Basically define a variable named as you like (maybe 'SIMULATOR') to be set during run in simulator. Set it in Build Settings of Target, under Active Compilation Conditions- > Debug then (+) then choose Any iOS Simulator SDK in the dropdown list, then add the variable.

Then in your code

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



回答4:


More explanation about this issue is here. I am using this approach:

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
    }

Or create a utility class:

class SimulatorUtility
{

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


来源:https://stackoverflow.com/questions/36180702/whats-wrong-with-my-if-target-os-simulator-code-for-realm-path-definition

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!