Используя Xcode 10 (бета 6), я могу без проблем написать и запустить следующий код:
import Intents
func test() {
let activity = NSUserActivity(activityType: "com.activtiy.type")
activity.title = "Hello World"
activity.isEligibleForSearch = true
activity.isEligibleForHandoff = false
if #available(iOS 12.0, *) {
activity.isEligibleForPrediction = true
activity.suggestedInvocationPhrase = "Say something"
}
print(activity)
}
Начиная с iOS 12, были добавлены свойства .isEligibleForPredictions
и .suggestedInvocationPhrase
, поэтому Xcode 10 может поддерживать сам код обратно совместимым, используя условное выражение if #available
.
Однако я хочу убедиться, что этот код обратно совместим с более ранними версиями Xcode. При запуске в Xcode 9 я получаю следующие ошибки:
if #available(iOS 12.0, *) {
// ERROR: Value of type 'NSUserActivity' has no member 'isEligibleForPrediction'
activity.isEligibleForPrediction = true
// ERROR: Value of type 'NSUserActivity' has no member 'suggestedInvocationPhrase'
activity.suggestedInvocationPhrase = "Say something"
}
Это происходит потому, что макрос #available
фактически разрешается во время выполнения, поэтому весь содержащийся в нем код по-прежнему необходимо успешно скомпилировать.
Можно ли мне сказать компилятору просто игнорировать эти две строки кода при сборке для iOS 11 или при использовании Xcode 9?