当前位置: 首页 > 知识库问答 >
问题:

Swift AnyObject作为字符串动态强制转换失败

巫马令
2023-03-14

我有一个Int,作为AnyObject保存在Parse中。当我检索AnyObject时?尝试将其转换为字符串、NSString、NSNumber或其他任何形式,我不断得到一个EXC_断点,因为转换返回Nil,并且出现“Swift dynamic cast failed”错误。

我试图创建这个简单的测试来找出哪个部分失败了,但疯狂的是,这个测试将通过似乎所有步骤都相同的地方:

func testAnyObjectCasting(){
    var myInt32: Int32 = 265
    var myInt: Int = Int(myInt32)
    var myAnyObject: AnyObject? = myInt as AnyObject
    var myAnyArray: [[AnyObject]] = [[AnyObject]]()
    myAnyArray.append(["something", myAnyObject!])
    println(myAnyObject)
    var myOtherAnyObject: AnyObject? = myAnyArray[0][1]
    println(myOtherAnyObject)
    var myString:NSNumber? = myOtherAnyObject as? NSNumber
    println(myString)
    var myInt2: Int = myString! as Int
}

以下是我的逻辑中的相关代码片段,并注意到println()在向下转换到NSNumber之前工作正常,此时返回Nil:

   //ABRecordGetRecordId returns an ABRecordID, which is of type Int32
   //This value that's stored in the 2nd column of the multiDim [[AnyObject]] 
   var personId: Int = Int(ABRecordGetRecordID(person))

   //This is a call to a Parse object, which returns an AnyObject.  I then cast that to
   //a multidimensional array AnyObject as that's the true structure of the data in swift speak
   var deviceContacts: [[AnyObject]] = device?[deviceContactsFieldName] as [[AnyObject]]

   //This returns the expected value, which in my broader test case is 99999, which is supported by Int
   var i:Int = 1
   println("the value in device contacts \(i) column 1 is: \(deviceContacts[i][1])")

   //This takes a single cell value from the multidim array and puts it in an optional AnyObject
   var valueInParse: AnyObject? = deviceContacts[i][1]

   //This still returns 99999
   println(valueInParse)

   //This is where 99999 is replaced with nil.  Any ideas?
   var valueNSNumberInParse: NSNumber? = valueInParse as? NSNumber

   //Nil :(
   println(valueNSNumberInParse)

   //Exception as I'm trying to unwrap nil :( 
   var unwrappedNSNumber:NSNumber = valueNSNumberInParse!

我的一部分挫败感是,我不明白为什么println()对任何对象都很好,但所有的转换都失败了。显然,有一些代码可以将该值解释为println的字符串,但我无法正确转换该语法。

共有1个答案

宗建章
2023-03-14

因为您已将Int保存到Parse中,并且Int不是对象,所以必须将其转换为对象。似乎解析框架已将其转换为NSValue,NSValue实际上是一个表示内在类型的字节缓冲区。

您可以尝试将这些字节转换回Int,但是在将其存储在Parse对象中之前,将值编码为NSNumber更容易也更好——然后在检索对象时,您将能够轻松处理它。

 类似资料:
  • 问题内容: 在SQL 9(2005)中创建了一个存储过程,此后已升级到SQL 10(2008)。从那时起,以下存储过程停止工作并引发上述错误: 传入的参数@vPortalUID包含:2A66057D-F4E5-4E2B-B2F1-38C51A96D385。我执行这样的存储过程: 它跌倒了。我也尝试过转换。仍然没有喜悦。也具有将{}括起来的价值。我如上所述以编程方式和手动方式删除了这些内容。 如果您

  • 我有一个家庭作业要重构一些代码来使用泛型。我觉得我为类做得很对。这是我的东西 当涉及到实例化时,我得到一个ClassCastException错误: 线程“main”java.lang.ClassCastException中出现异常:类java.lang.String无法强制转换为类edu.csc.node(java.lang.String位于加载程序“bootstrap”的模块java.base

  • 首先,这不是一篇重复的帖子,因为我的问题比这更特别。 我知道如何使用该文件远程将字符串转换为字节。ReadAllBytes();命令,它可以完美地用于远程目的。 现在我想在不使用文件的情况下实现同样的效果。ReadAllBytes();方法并在代码内执行所有操作 这是我想要实现的明确示例: 这是一个19个字符的普通字符串 这就是我想要结束的 是否可以在不使用输入/输出命令的情况下将字符串变量动态转

  • 今天早上,我试图将LibraryFolder ClasspathContainer插件安装到我的Eclipse(STS 3.6.1)中:每次尝试执行时,安装它都会导致上述错误。 更糟糕的是,我试图从Eclipse Marketplace安装插件,但Eclipse在出现大量错误时开始崩溃,包括JVM崩溃。卸载两个插件都没有修复。我尝试了一个新的工作区和一个空白的Eclipse安装,但最终不得不安装以

  • 我有一些我无法控制的代码。此代码接受一个对象参数,并尝试将其转换为编译时已知的类型,如下所示: 在C#中是否可以设计一个自定义类(不是从KnownType派生的),该类可以作为参数传递给上述代码,并通过上述代码转换为,前提是可以使用其成员方法将自身转换为: 我曾尝试实现这样的自定义转换运算符: 但是它不起作用(它没有被使用)。假设转换运算符仅在编译时已知源类型、目标类型和转换运算符时才起作用,这是