Apple Swift:Type Casting Generics

nal*_*d88 6 generics ios swift

我正在写一些Swift代码,其中我有一个包含泛型类型的数组:

let _data: Array<T> = T[]()
Run Code Online (Sandbox Code Playgroud)

稍后在我的代码中,我需要确定存储在数组中的类型.我尝试使用文档中描述的类型转换技术(尽管它没有用于泛型).

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
}
Run Code Online (Sandbox Code Playgroud)

上面的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

有人知道如何将我的通用数据转换为实际类型以采取特定的行动吗?

Ray*_*Fix 1

假设您有一个按钮数组:

let views: [NSView] = [NSButton(), NSButton(), NSButton()]
Run Code Online (Sandbox Code Playgroud)

您可以使用这些转换:

let viewsAreButtons = views is [NSButton]  // returns true
let buttonsForSure = views as! [NSButton]  // crashes if you are wrong
let buttonsMaybe = views as? [NSButton]    // optionally set
Run Code Online (Sandbox Code Playgroud)

如果您尝试在如下所示的开关盒中使用 as ,它将不起作用。编译器(Swift 1.2 Xcode 6.3b1)说:“无法使用 [NSButton] 类型的向下转型模式。”

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

称之为限制。将雷达与您的用例一起归档。Swift 团队似乎确实在倾听反馈。如果您确实想让它工作,您可以定义自己的模式匹配运算符。在这种情况下,它会是这样的:

struct ButtonArray { }
let isButtonArray = ButtonArray()

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

然后这有效:

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

在游乐场尝试一下。希望能帮助到你!