在Swift 4中检查数组值是否为有效数字

时间:2019-03-20 03:12:47

标签: objective-c swift

我有以下在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 个答案:

答案 0 :(得分:2)

要检查对象是否为数字(在您的情况下为Int),您可以执行以下两项操作:

  1. 通过isas?

    进行类型检查
    • 这仅检查类型,而不检查内容

      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数组,我们可以使用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类型。
因此,我怀疑这是否适合您的要求。

答案 1 :(得分:-1)

尝试一下:

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