Чтобы проверить, является ли объект числом (Int
в вашем случае), вы можете сделать две вещи:
Проверка типа через is
или as?
Это проверяет только тип, а не содержимое
let isNumberType = "1" is Int
print(isNumberType) //false because "1" is of type String
Создание Int
через его инициализатор
Возвращает Int?
, потому что он может потерпеть неудачу, поэтому дополнительная проверка != nil
let something = "1"
let isNumber = Int(something) != nil
print(isNumber) //true because "1" can be made into an Int
ПРИМЕЧАНИЕ: согласно вашему примеру, вы проверяете только четные элементы, поэтому мы будем использовать stride(from:to:by:)
Решение № 1:
Предполагая, что у вас есть массив String
s, мы можем использовать инициализатор Int
, чтобы проверить, может ли элемент string
быть числом, например:
func check(expression: [String]) -> Bool {
for idx in stride(from: 0, to: expression.count, by: 2) {
let isNumeric = Int(expression[idx]) != nil
if isNumeric == false {
return false
}
}
return true
}
check(expression: ["1", "A", "2", "B", "3", "C"]) //true
check(expression: ["1", "A", "2", "B", "E", "C"]) //false
Решение № 2:
Предполагая, что ваш массив имеет тип [Any]
, и вы хотите набрать, проверьте, чтобы альтернативные элементы были Int
, затем используйте is
, например, так:
func check(expression: [Any]) -> Bool {
for idx in stride(from: 0, to: expression.count, by: 2) {
let isNumeric = expression[idx] is Int
if isNumeric == false {
return false
}
}
return true
}
check(expression: [1, "A", 2, "B", 3, "C"]) //true
check(expression: [1, "A", 2, "B", "3", "C"]) //false
С [Any]
дело в том, что его элементы нельзя подавать напрямую в инициализатор Int
, не переводя его в приемлемый тип.
Так что в этом примере, для простоты, мы просто проверяем, имеет ли объект тип Int
или нет.
Поэтому я сомневаюсь, что это соответствует вашему требованию.