Использовать UIKit условно в файле, используемом приложением Watch

Я создал класс модели, который использую в своем приложении для iOS и в приложении Watch - он включен в обе цели. Теперь мне нужно использовать UIPasteboard в этом классе, который доступен только в UIKit, но недоступен для watchOS. Хотя я могу импортировать UIKit в этот файл без проблем, когда я использую UIPasteboard, он не будет компилироваться, потому что расширение часов не знает об этом.

Как я могу использовать UIPasteboard в классе, доступном для моего приложения для часов?

Мне было интересно, смогу ли я запустить этот код, только когда устройство не Apple Watch, с помощью #available, но это не решило проблему.

if #available(iOS 7.0, *) {
    UIPasteboard.generalPasteboard()...
    //ERROR: Use of unresolved identifier 'UIPasteboard'
} else {
    //don't use UIPasteboard
}

person Jordan H    schedule 16.08.2015    source источник


Ответы (3)


Используйте существующую директиву препроцессора, определенную в Swift:

#if os(iOS)
//UIKit code here
#elseif os(watchOS)
//Watch code here
#endif

См. Документацию по директивам препроцессора здесь.

person Leo Natan    schedule 16.08.2015

Возможно, вы могли бы использовать расширение, чтобы исключить функциональность UIPasteboard и включить файл, содержащий расширение, только в целевой iPhone.

В идеале код, совместно используемый несколькими ОС, должен содержать только действительно общий код.

Кроме того, если вам нужна условность, возможно, это более простой способ сделать это.

person Mundi    schedule 16.08.2015

Это можно сделать двумя способами.

Первый способ - использовать директивы препроцессора, как в следующем примере:

#if os(iOS)
    //Insert UIKit (iOS) code here
#elseif os(watchOS)
    //Insert WatchKit (watchOS) code here
#endif

Второй способ - определить, вызывается ли код из расширения WatchKit или приложения iOS. Например, вы можете установить глобальный логический флаг в true перед вызовом кода из WatchKit Extension и false перед вызовом из приложения iOS. Затем общий код может проверить значение флага, чтобы определить, работает ли он на iOS или watchOS.

person Seyyed Parsa Neshaei    schedule 17.08.2015
comment
Глобальная переменная не работает. Код не будет компилироваться независимо от значения переменной. - person Leo Natan; 18.08.2015