簡體   English   中英

Apple Swift:Type Casting Generics

[英]Apple Swift: Type Casting Generics

我正在寫一些Swift代碼,其中我有一個包含泛型類型的數組:

let _data: Array<T> = T[]()

稍后在我的代碼中,我需要確定存儲在數組中的類型。 我嘗試使用文檔中描述的類型轉換技術(盡管它沒有用於泛型)。

switch self._data {
case let doubleData as Array<Double>:
  // Do something with doubleData
case let floatData as Array<Float>:
  // Do something with floatData
default:
  return nil // If the data type is unknown return nil
}

上面的switch語句在編譯時導致以下錯誤:

  1. 在/code.viperscience/Adder/src/Adder Library / Matrix.swift:45:3:0:錯誤:無法執行命令時發出IR SIL函數@ _TFC19Adder_Example ___ Mac6Matrix9transposeUS_7Element__fGS0_Q__FT_GSqGS0_Q___ for'transpose':分段錯誤:11:0:錯誤: swift前端命令因信號失敗(使用-v查看調用)命令/Applications/Xcode6-Beta2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift失敗,退出代碼為254

有人知道如何將我的通用數據轉換為實際類型以采取特定的行動嗎?

在迅速, as操作者是一樣的東西dynamic_cast在C ++中,這可以向下澆鑄的對象一起使用。

說你有一個對象a類的A ,並且可以編寫let a as B ,只有當類型B相同類型A ,或B是子類的A

在您的情況下,顯然Array<T>不能總是向下轉換為Array<Double>Array<Float> ,因此編譯器報告錯誤。

一個簡單的解決方法是首先轉換為AnyObject ,然后向下轉換為Array<Double>Array<Float>

let anyData: AnyObject = self._data;
switch anyData {
case let doubleData as? Array<Double>: // use as? operator, instead of as,
                                       // to avoid runtime exception
  // Do something with doubleData
case let floatData as? Array<Float>:
  // Do something with floatData
default:
  return nil // If the data type is unknown return nil

假設您有一組按鈕:

let views: [NSView] = [NSButton(), NSButton(), NSButton()]

你可以使用這些演員表:

let viewsAreButtons = views is [NSButton]  // returns true
let buttonsForSure = views as! [NSButton]  // crashes if you are wrong
let buttonsMaybe = views as? [NSButton]    // optionally set

如果您嘗試使用如下所示的開關盒,它將無法工作。 編譯器(Swift 1.2 Xcode 6.3b1)說:“不能使用[NSButton]類型的Downcast模式。”

switch views {
  case let buttons as [NSButton]:
    println("Buttons")
  default:
    println("something else")
}

稱之為限制。 使用您的用例提交雷達。 Swift團隊真正接受了反饋。 如果您真的想讓它工作,您可以定義自己的模式匹配運算符。 在這種情況下,它將是這樣的:

struct ButtonArray { }
let isButtonArray = ButtonArray()

func ~=(pattern: ButtonArray, value: [NSView]) -> Bool {
    return value is [NSButton]
}

然后這工作:

switch views {
  case isButtonArray:
      println("Buttons")    // This gets printed.
  default:
     println("something else")
}

在游樂場嘗試一下。 希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM