我想将定义为RealmOptional
或者的类型转换为Int
或者Float
,取决于分配给泛型的类型.然而,当我尝试使用它们分发switch
声明,原来不是RealmOptional
,但RealmOptional
被归类到Int
的情况.例如,
switch value { // value is of type AnyObject? case is String: cell.valueLabel.text = value as? String case is Int: // RealmOptionalare executed here let v = value as! Int cell.valueLabel.text = String(v) // Float is now treated as Int case is Double: print("double") // not printed at all cell.valueLabel.text = String(value!) default: break }
为什么RealmOptional
表现得像Int
这里一样?如何将文本设置为value
正确?
让我们假设您的RealmOptional
变量已命名myFloat
.然后,使用的RealmOptional,吸气:S(见的境界这个混帐项)潜在价值,.value
而再检查RealmOptional本身:
var value = myFloat.value // value variable now of type Float
下面说明并说明AnyObject?
开关不按预期运行的原因:
从苹果语言指南 - 类型转换:
为Any和AnyObject键入Casting
Swift提供了两种特殊类型的别名,用于处理非特定类型:
AnyObject可以表示任何类类型的实例.
Any可以表示任何类型的实例,包括函数类型.
因此,AnyObject
类型可以可容纳任何类型的实例,但根本数值类型(Int
,Double
等)在夫特是类型的,而是结构类型.
在switch
你的榜样,该AnyObject
实例未推断,但投的第一个可能成功的垂头丧气,这将是无论case
你把最上面的是一个数字式的.因此,如果您case
在交换机中更改了:s 的顺序,则转换将更改.
let value: AnyObject? = 30.0 // try change the order switch value { case is String: print("string"); case is Float: print("float"); // hits `Float` downcast first -> prints float case is Int: print("int"); default: print("other") }
但是,现在,您可以将您AnyObject
转换为NSNumber
(类实例),并从那里继续.从使用Cocoa数据类型文档:
Swift数值结构类型的实例(如Int,UInt,Float,Double和Bool)不能由AnyObject类型表示,因为AnyObject仅表示类类型的实例.但是,当启用桥接到Foundation时,可以将Swift数值赋值为AnyObject类型的常量和变量,作为NSNumber类的桥接实例.
然而要注意NSNumber
从斯威夫特数字类型(本质上的区别Int
,Double
在于前者等)持有任何种类的数量,并允许我们投这个号码,以不同类型的数字类型的.但是,我们不能轻易地推断出NSNumber
应该转换特定实例的类型,但是我们可以实现我们自己的(不那么漂亮)规范,如何推断NSNumber
不同的swift基本数字类型.
但是,在继续进行NSNumber
黑客攻击之前:
从上面来看,核心问题是你的value
财产属于类型AnyObject?
.你能否发布导致value
类型的代码AnyObject?
.如果使用RealmOptional的getter(因此不需要转换为?),如果没有必要Int
,可能会进行转换,Float
等等.RealmOptional
AnyObject?