双数的类型是Swift中的Int
// Swift import UIKit let arr = [1,"a",2.88] let last = arr.last if last is Int { print("The last is Int.") // The last is Int. } else { print("The last is not Int.") } 我无法理解打印的结果. // Swift import UIKit let arr = [1,-2] let last = arr.last if last is Double { print("The last is Double.") // The last is Double. } else { print("The last is not Double.") } 这张照片“The last is Double”.为什么? 解决方法
Swift数组只能包含一种类型.当你宣布:
let arr = [1,2.88] Swift制作了[NSObject]类型的arr.您可以通过按住Option键并单击arr来查看其类型来验证这一点.这只能起作用,因为您已导入Foundation(您的导入UIKit也会导入Foundation).尝试删除导入UIKit. 然后,将值1和2.88转换为NSNumber并将“a”转换为NSString,以便它们可以存储在[NSObject]数组中,因为Ints,Strings和Doubles不是NSObject. NSNumber和NSString是NSObject的子类. Swift为数组选择了最严格的类型.如果您的数组为[1,true,2.88],则数组类型为[NSNumber]. 关于NSNumber的有趣之处在于它是一个包装许多不同类型的对象容器.你可以放入一个Int并取出一个Double.所以,当你用is测试它时会产生误导.它回应“真实”的含义,“如果你愿意,我可以做到”. import Foundation let n: NSNumber = 3.14 print(n is Int) // "true" print(n is Double) // "true" print(n is Bool) // "true" print(n as! Int) // "3" print(n as! Double) // "3.14" print(n as! Bool) // "true" 注意:如果你宣布你的arr是[Any],那么这将按预期工作: let arr:[Any] = [1,2.88] let last = arr.last if last is Int { print("The last is Int.") } else { print("The last is not Int.") // "The last is not Int." } 但除非你明确要求,否则Swift不会为你创建一个Any类型的数组(因为坦率地说它是强类型语言中的憎恶).如果你发现自己使用[Any],你应该重新考虑你的设计. 导入Foundation时Swift创建[NSObject]的唯一原因是在调用Cocoa和Cocoa Touch API时让我们的生活变得更轻松.如果这样的API需要传递NSArray,则可以发送[1,“a”,2.88]而不是[NSNumber(整数:1),NSString(字符串:“a”),NSNumber(double:2.88)]. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |