我有以下在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中我需要等效的代码。我尝试了不同的方法,但是无法解决。要求是检查数组的元素是否为数字。
答案 0 :(得分:2)
要检查对象是否为数字(在您的情况下为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:)
假设您有一个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
假设您的数组的类型为[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")
}
}