swit 强转int

clipboard.png
我这里 哪里不对 我转成string 是可以的 但是我现在想强转int 就是一直崩溃

阅读 4.6k
3 个回答

clipboard.png
这样是可以的 就是先把string 转成sting 再转int

从你上面的错误信息反应出, 你对强制类型转换有所误解.
从上面的错误信息可以得知 code 原本是一个 NSString 类型的变量.

1) 如果 codeString 类型,那么编译器会有如下警告:

Cast from 'String' to unrelated type 'Int' always fails
运行时错误信息如下:
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

2) 因为变量是 NSString 类型时才会有如下的报错信息:

Could not cast value of type 'NSTaggedPointerString' (0x7fff91585138) to 'NSNumber' (0x7fff919ecae8).

对应代码

var code:NSString = "123"
var judge:Int = code as! Int

不知道有没有觉得好奇,上面代码是想把 NSString 转成 Int 但是错误信息却是说:

不能把 NSTaggedPointerString 类型的的变量(地址在:0x7fff91585138) 转成 NSNumber (地址在0x7fff919ecae8)

对于 NSTaggedPointerString 的细节感兴趣的话可以看一下这篇文章: Friday Q&A 2015-07-31: Tagged Pointer Strings , 简而言之呢? 就是 NSString 就好比是一个抽象类,而 NSTaggedPointerString 是 OC 对于字符串存储的优化的一种具体的实现.

3) 什么时候才可以使用强制类型转换?
为什么上面的类型转换不能用呢? 因为他们不能直接转换, 他们没有类型关系.
虽然类型转换是一个动词.但是它并不是像我们现实中变魔术,或者发生化学反应式的可以把一个东西转换成另
一个东西. 通常我们进行类型转换只是像找回对应对象它本来的样子.

像我们面向对象语言中经举的例子一样, 比如: 有以下类关系:

 class Person{}
 class Teacher:Person{}
 class Student:Person{}

有一个接受 Person 类型的方法: func checkIn(person:Person)
有可能在 checkIn 中如果 personTeacher 类的对象的话,你有有一些其他的处理.
那么这个时候你就需要用到强制类型转换. if let teacher = person as? Teacher.
所以 类型转换是因为在我们的编程或者抽象过程当中,对象类型的精确信息丢失了,我们需要通过类型转换来找出来.

guard let codeStr = code, let judge = Int(codeStr) else {
    return
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题