Проверка правильности значения массива в Swift 4 - PullRequest
0 голосов
/ 20 марта 2019

У меня есть следующий код, который работает в Objective-C:

NSScanner *scanner ;
for(int i = 0; i < [expression count]; i = i + 2)
{
    scanner = [NSScanner scannerWithString:[expression objectAtIndex:i]];
    BOOL isNumeric = [scanner scanInteger:NULL] && [scanner isAtEnd];
    if(!isNumeric)
        return false;
}
return true;

Мне нужен эквивалентный код в Swift 4. Я пробовал разные вещи, но не смог разобраться. Требуется проверить, являются ли элементы массива числами или нет.

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Чтобы проверить, является ли объект числом (Int в вашем случае), вы можете сделать две вещи:

  1. Проверка типа через is или as?

    • Это проверяет только тип, а не содержимое

      let isNumberType = "1" is Int
      print(isNumberType) //false because "1" is of type String
      
  2. Создание 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 или нет.
Поэтому я сомневаюсь, что это соответствует вашему требованию.

0 голосов
/ 20 марта 2019

Попробуйте это:

var str = "1234456";
let scanner = Scanner(string: str);
let isNumeric = scanner.scanInt(nil) && scanner.isAtEnd
if !isNumeric {
   print("not numeric")
} else {
   print("is numeric")
}

В целом, если вы просто хотите проверить, что данная строка является анализируемым целым числом, я рекомендую вам попробовать:

var expressions = ["1234456","abcd"];
for str in expressions {
    if let isNumeric = Int(str) {
        print("is numeric")
    } else {
        print("not numeric")
    }
}
...