2015-12-22 188 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趕上了。也許有人可以在...

相關問題