Что не так с моим кодом #if TARGET_OS_SIMULATOR для определения пути к области?

У меня есть этот код

 #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 работает только для остальных условий.

Ответ 1

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

Начиная с Xcode 9. 3+ Swift теперь поддерживает, if #targetEnvironment(simulator) чтобы проверить, строите ли вы для симулятора.

Пожалуйста, прекратите использовать архитектуру в качестве ярлыка для симулятора. И macOS, и Simulator имеют 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

Ответ 3

Пожалуйста, смотрите этот пост. Это правильный способ сделать это, и он хорошо объяснил

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

Ответ 4

Более подробное объяснение этой проблемы здесь. Я использую этот подход:

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
        }
    }
}