在Swift中检查一个对象是否是给定类型

324

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

如何在Swift中检查对象是否为特定类型?


1
你的问题是关于查找给定对象类型的,但你已经接受了一个只能检查对象是否为给定类型的答案。我建议你编辑你的问题,明确这一点,否则许多读者会对你接受的答案感到不满意。(其他所有答案都类似,所以幸运的是,你不需要担心通过缩小问题范围使它们无效。) - Jeremy
1
我已经编辑了这个问题,以使其与https://dev59.com/rWAf5IYBdhLWcg3w9mts区分开来,我正在投票重新打开它。它们都是有用的、类似的问题,但答案却非常不同,因此将它们分开会很有用。 - Jeremy
1
可能是重复的问题:如何在Swift中找出对象的类型? - Esqarrouth
20个回答

4
您可以使用此函数并调用它:
func printInfo(_ value: Any) {
    let t = type(of: value)
    print("'\(value)' of type '\(t)'")
}

例如:printInfo(data)

'125 字节' 的类型为 'Data'


2

Swift 4.2,在我的情况下,使用isKind函数。

isKind(of :)返回一个布尔值,指示接收器是否是给定类的实例或继承自该类的任何类的实例。

注意:翻译中的代码保留了英文原文。

  let items : [AnyObject] = ["A", "B" , ... ]
  for obj in items {
    if(obj.isKind(of: NSString.self)){
      print("String")
    }
  }

阅读更多 https://developer.apple.com/documentation/objectivec/nsobjectprotocol/1418511-iskind


2
那不是Swift。它是Cocoa,只能在Objective C适用的地方工作。 - matt

2

myObject as? String 如果 myObject 不是 String 类型,返回 nil。否则,它会返回一个 String?,因此您可以使用 myObject! 访问字符串本身,或者使用 myObject! as String 进行安全转换。


2

为什么不使用像这样的东西

fileprivate enum types {
    case typeString
    case typeInt
    case typeDouble
    case typeUnknown
}

fileprivate func typeOfAny(variable: Any) -> types {
    if variable is String {return types.typeString}
    if variable is Int {return types.typeInt}
    if variable is Double {return types.typeDouble}
    return types.typeUnknown
}

在Swift 3中。


2

如果你只是想检查类而不因未使用定义值(让一些变量…)而收到警告,你可以简单地用布尔值替换let语句:

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

当我使用let方式而没有使用定义的值时,Xcode建议我这样做。

1

Swift 3:

class Shape {}
class Circle : Shape {}
class Rectangle : Shape {}

if aShape.isKind(of: Circle.self) {
}

1

Swift 5.2 & Xcode 版本:11.3.1(11C504)

这是我检查数据类型的解决方案:

 if let typeCheck = myResult as? [String : Any] {
        print("It's Dictionary.")
    } else { 
        print("It's not Dictionary.") 
    }

我希望它能对你有所帮助。

2
当回答一个旧问题时,如果您包含一些上下文来解释您的答案如何帮助,特别是对于已经有被接受答案的问题,那么您的答案将对其他StackOverflow用户更有用。请参阅:如何撰写好的答案 - David Buck

0
如果你不知道从服务器返回的结果是字典数组还是单个字典,你需要检查结果是否包含了数组。
在我的情况中,除了一次外,我总是收到一个字典数组。因此,为了处理这种情况,我使用了以下代码来适用于Swift 3。
if let str = strDict["item"] as? Array<Any>

在这里,我们检查获取的值是否为数组(字典项的数组)。否则情况下,你可以处理它是否是单个字典项,而不是保存在数组中。


0
如果您有这样的响应:
{
  "registeration_method": "email",
  "is_stucked": true,
  "individual": {
    "id": 24099,
    "first_name": "ahmad",
    "last_name": "zozoz",
    "email": null,
    "mobile_number": null,
    "confirmed": false,
    "avatar": "http://abc-abc-xyz.amazonaws.com/images/placeholder-profile.png",
    "doctor_request_status": 0
  },
  "max_number_of_confirmation_trials": 4,
  "max_number_of_invalid_confirmation_trials": 12
}

如果你想检查值 is_stucked,它将被读取为 AnyObject,你只需要这样做

if let isStucked = response["is_stucked"] as? Bool{
  if isStucked{
      print("is Stucked")
  }
  else{
      print("Not Stucked")
 }
}

0
let originalArray : [Any?] = ["Hello", "World", 111, 2, nil, 3.34]
let strings = originalArray.compactMap({ $0 as? String })

print(strings)
//printed: ["Hello", "World"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接