我这里 哪里不对 我转成string 是可以的 但是我现在想强转int 就是一直崩溃
从你上面的错误信息反应出, 你对强制类型转换有所误解.
从上面的错误信息可以得知 code
原本是一个 NSString
类型的变量.
1) 如果 code
是 String
类型,那么编译器会有如下警告:
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
中如果 person
是 Teacher
类的对象的话,你有有一些其他的处理.
那么这个时候你就需要用到强制类型转换. if let teacher = person as? Teacher
.
所以 类型转换是因为在我们的编程或者抽象过程当中,对象类型的精确信息丢失了,我们需要通过类型转换来找出来.
2 回答737 阅读
1 回答907 阅读
2 回答696 阅读
1 回答708 阅读
1 回答777 阅读
687 阅读
568 阅读
这样是可以的 就是先把string 转成sting 再转int