我有一个由AnyObject组成的数组。我想遍历它,找到所有数组实例的元素。

我怎么能检查如果一个对象是一个给定的类型在Swift?


当前回答

你可以使用这个函数,然后调用它:

func printInfo(_ value: Any) {
    let t = type(of: value)
    print("'\(value)' of type '\(t)'")
}

例如:printInfo(data)

数据类型为“125字节”

其他回答

如果你想检查一个特定的类型,你可以做以下事情:

if let stringArray = obj as? [String] {
    // obj is a string array. Do something with stringArray
}
else {
    // obj is not a string array
}

你可以使用"as!",如果obj不是[String]类型,就会抛出一个运行时错误。

let stringArray = obj as! [String]

你也可以一次检查一个元素:

let items : [Any] = ["Hello", "World"]
for obj in items {
   if let str = obj as? String {
      // obj is a String. Do something with str
   }
   else {
      // obj is not a String
   }
}

如果你只是想检查类而不得到警告,因为未使用的定义值(let somvariable…),你可以简单地用一个布尔值替换let:

if (yourObject as? ClassToCompareWith) != nil {
   // do what you have to do
}
else {
   // do something else
}

Xcode在我使用let方法而没有使用定义值时提出了这个建议。

只是为了完整起见,基于公认的答案和其他一些答案:

let items : [Any] = ["Hello", "World", 1]

for obj in items where obj is String {
   // obj is a String. Do something with str
}

但是你也可以(compactMap也“映射”过滤器没有的值):

items.compactMap { $0 as? String }.forEach{ /* do something with $0 */ ) }

以及一个使用switch的版本:

for obj in items {
    switch (obj) {
        case is Int:
           // it's an integer
        case let stringObj as String:
           // you can do something with stringObj which is a String
        default:
           print("\(type(of: obj))") // get the type
    }
}

但回到问题上来,检查它是否是一个数组(即[String]):

let items : [Any] = ["Hello", "World", 1, ["Hello", "World", "of", "Arrays"]]

for obj in items {
  if let stringArray = obj as? [String] {
    print("\(stringArray)")
  }
}

或者更一般地说(见另一个问题的答案):

for obj in items {
  if obj is [Any] {
    print("is [Any]")
  }

  if obj is [AnyObject] {
    print("is [AnyObject]")
  }

  if obj is NSArray {
    print("is NSArray")
  }
}

你可以使用这个函数,然后调用它:

func printInfo(_ value: Any) {
    let t = type(of: value)
    print("'\(value)' of type '\(t)'")
}

例如:printInfo(data)

数据类型为“125字节”

是吗?不会总是给出预期的结果,因为as并不测试数据类型是否为特定类型,而只测试数据类型是否可以转换为或表示为特定类型。

以下面的代码为例:

func handleError ( error: Error ) {
    if let nsError = error as? NSError {

每个符合Error协议的数据类型都可以转换为NSError对象,所以这总是会成功。但这并不意味着error实际上是一个NSError对象或它的子类。

正确的类型检查应该是:

func handleError ( error: Error ) {
    if type(of: error) == NSError.self {

但是,这只检查确切的类型。如果你还想包含NSError的子类,你应该使用:

func handleError ( error: Error ) {
    if error is NSError.Type {