gpt4 book ai didi

arrays - swift :任何对象作为?如果数组为空(不是零),则数组转换失败

转载 作者:行者123 更新时间:2023-11-28 09:35:30 25 4
gpt4 key购买 nike

情况是这样的:假设我得到一个作为 AnyObject 或 Any 的变量。然后,我必须转换变量以了解它是否是包含特定类型对象的数组。

func myFuction(receivedObject: AnyObject) {
if let validDogs = receivedObject as? [Dog] {

print("Received object is an array of dogs")
// Do something with valid dogs
}

if let validCats = receivedObject as? [Cat] {

print("Received object is an array of cats")
// Do something with valid cats
}
}

如果接收到的对象不是空数组(不是 nil),此代码有效,但如果接收到的对象是空数组,则失败,因为我的日志打印了这两条消息:

"Received object is an array of dogs"
"Received object is an array of cats"

这表明对于空数组,转换失败。那么,有没有办法解决这个问题?

最佳答案

像这样的代码强烈表明您的字体设计存在深层问题,应该通过删除 AnyObject 来解决。 .通过 AnyObject 是非常罕见的是正确的工具。

你在这里说了一些非常重要的话:

This code works if the received object is not an empty array (not nil)

空数组与nil 不是一回事.如果你通过 nil ,这是一个可选的。 Optional<[Cat]>[Cat] 不同你不应该期望它始终如一 as?强制转换,特别是如果它是 nil .如果这来自 ObjC,那 nil桥接到一个实际的 Obj-C nil (这只是值 0),并且运行时实际上没有任何作用。

不过,您说您收到了两行日志。这表明 as?类型转换是成功的,而不是失败的。如果是这样,我认为这是一个 NSArray , 和一个空的 NSArray可以合法地成为 as?转换为任意数组(NSArray 内部没有元素类型)。所以以上是预期的。

如果它真的是可选的,那么对于“我如何确定它是可选的然后解开它然后计算它是否是 [Cat] ”的问题,答案是“停止;你也去了与 AnyObject 相距甚远。”首先重新设计它,这样您就不需要它了,这通常意味着更早地确定您的类型。

做你想做的事情的正确方法通常是重载,而不是 as?类型转换:

func myFuction(receivedObject: [Dog]) {
print("Received object is an array of dogs")
// Do something with valid dogs
}

func myFuction(receivedObject: [Cat]) {
print("Received object is an array of cats")
// Do something with valid cats
}

你不能只传递 AnyObject到上述功能。你需要知道你正在使用的东西的类型。 (您关于使用 as! AnyObject 剥离类型的评论表明您确实已经知道这些类型,并且正在主动丢弃它们并尝试稍后恢复它们。如果是这种情况,上面的代码是完全正确的。不要丢弃类型。)

虽然在某些极端情况下您无法知道这些类型(因为您实际上是在接受“任何对象”),但在绝大多数情况下无法知道您的类型表明存在设计问题。

关于arrays - swift :任何对象作为?如果数组为空(不是零),则数组转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46876445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com