2015-12-22 189 views
3

我想将定义为RealmOptional的类型转换为IntFloat,具体取决于分配给通用的类型。但是,当我尝试使用switch声明分发它们时,原来不是RealmOptional<Int>()而是RealmOptional<Float>()被归类为Int的情况。例如,如何在Swift中将RealmOptional转换为Int或Float?

switch value { // value is of type AnyObject? 
    case is String: 
     cell.valueLabel.text = value as? String 
    case is Int: 
     // RealmOptional<Float> are 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<Float>()表现为Int这里?我怎样才能正确地设置文本到value

回答

4

让我们假设你的RealmOptional<Float>()变量名为myFloat。然后,使用的RealmOptional,吸气:S(见this git entry for Realm潜在价值.value,而不是检查RealmOptional本身:

var value = myFloat.value // value variable now of type Float 

下面如下以及为什么AnyObject?开关不解释表现为你所期望:

Apples Language Guide - Type Casting

ŧ YPE铸造所有和AnyObject

夫特提供了两种特殊类型的别名与非特异性 类型工作:

  • AnyObject可代表任何类类型一个实例。
  • 任何可以表示任何类型的实例,包括函数类型。

因此,AnyObject类型可以可容纳任何类型的实例,但根本数值类型(IntDouble等)在夫特是类型的,而是结构类型。

在您的示例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") 
} 

现在,你可以,但是,投你AnyObjectNSNumber(类的实例),并从那里继续。从Working with Cocoa Data Types documentation

迅数字结构类型,如int,UINT, 浮点,双精度,和布尔的实例中,不能由AnyObject类型, 因为AnyObject仅代表一个类类型的实例来表示。但是,启用桥接到Foundation的 时,Swift数值可以是 分配给AnyObject类型的常量和变量作为桥接的 NSNumber类的实例。

然而要注意NSNumber是从前者雨燕数值类型(IntDouble等)有着根本的不同持有任何种类的数量,并允许我们投这个号码,以不同类型的数字类型的。但是,我们不能轻易推断出应该将哪个类型的特定实例应用到哪个类型,但是我们可以实现我们自己的(不那么漂亮)规范,以便如何根据不同的快速基本数值类型推断不同的NSNumber

然而,随着NSNumber黑客继续之前:

从以上,核心的问题是,你的value属性是AnyObject?型。您能否请发布导致valueAnyObject?类型的代码。如果使用RealmOptional的吸气剂(因此不需要铸造RealmOptional<T>()AnyObject??),则可能将其施放到IntFloat等等。

+0

是的,虽然你在switch语句中使用了第一个可能的downcast,但我仍然希望将一个定义为“RealmOptional ()”的变量转换为Float(而不是Int),同样的在'RealmOptional ()'的情况下为真。你的第二个代码将在'Int'和'Double'中执行,这不是我正在追求的目标... – Blaszard

+0

@Blaszard:我的答案已更新。 – dfri

+0

谢谢。但我必须改变它的原因是因为当时不能判断物体的类型;换句话说,它可能被定义为'RealmOptional ()','RealmOptional ()',或者只是一个'String'。这就是为什么它首先被输入为“AnyObject?”,我想切换它。 – Blaszard

0

我发现这与Realm无关;它与Swift有关。在Swift中,当你在switch中传递一个浮动对象时,它不仅会被追上is Float,还会被追加到is Int中,因为浮动数字也可以转换为Int

例如,下面的代码不经过is Float条件,因为它是在is Int赶上了:

let value: AnyObject? = 30.0 
switch value { 
    case is String: print("string"); 
    case is Int: print("int"); 
    case is Float: print("float"); 
    default: print("other") 
} 

这就是为什么RealmOptional<Float>()is Int赶上了。

我仍然不知道我怎么能与问题处理在这里,因为Int类型的对象在is Float被赶上和Float类型的对象是在is Int赶上了。也许有人可以在...

相关问题