Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Apple Swift:类型转换泛型_Ios_Generics_Swift - Fatal编程技术网

Ios Apple Swift:类型转换泛型

Ios Apple Swift:类型转换泛型,ios,generics,swift,Ios,Generics,Swift,我正在编写一些Swift代码,其中有一个包含泛型类型的数组: let _data: Array<T> = T[]() let_data:Array=T[]() 在后面的代码中,我需要确定数组中存储的类型。我尝试使用中描述的类型转换技术(尽管它没有用于泛型) switch self.\u数据{ case let doubleData作为数组: //用doubleData做点什么 案例让数据作为数组: //对浮动数据做些什么 违约: 返回nil//如果数据类型未知,则返回nil }

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

let _data: Array<T> = T[]()
let_data:Array=T[]()
在后面的代码中,我需要确定数组中存储的类型。我尝试使用中描述的类型转换技术(尽管它没有用于泛型)

switch self.\u数据{
case let doubleData作为数组:
//用doubleData做点什么
案例让数据作为数组:
//对浮动数据做些什么
违约:
返回nil//如果数据类型未知,则返回nil
}
上述switch语句在编译时会导致以下错误:

  • 当发射红外SIL功能时,例如MAC6Matrix 9Transposeus 7Element fGS0 Q FT GSqGS0 Q___ 对于/code.viperscience/Adder/src/Adder处的“转置” 库/矩阵。swift:45:3:0:错误:无法执行 命令:分段错误:11:0:错误:swift前端 由于发出信号(使用-v查看调用)命令,命令失败 /Applications/Xcode6-Beta2.app/Contents/Developer/Toolchains/xcodefault.xctoolchain/usr/bin/swift 失败,退出代码254

  • 谁知道如何将我的通用数据转换到它的实际类型以采取特定的动作?

    < p>在SWIFT,<代码> AS < /C>操作程序中的代码是“C++中的代码>动态DistaCase< /Cord>,它可以用于<强>下投< /强>对象。< /P> 假设您有一个类型为
    a
    的对象
    a
    ,并且只有当类型
    B
    与类型
    a
    相同,或者
    B
    a
    的子类时,您才能将
    设为B

    在您的情况下,
    Array
    显然不能总是向下转换为
    Array
    Array
    ,因此编译器会报告错误

    一个简单的解决方法是首先转换为
    任何对象
    ,然后向下转换为
    数组
    数组

    让anyData:AnyObject=self.\u data;
    切换任意数据{
    case let doubleData as?Array://使用as?运算符,而不是as,
    //避免运行时异常
    //用doubleData做点什么
    case let floatData as?数组:
    //对浮动数据做些什么
    违约:
    返回nil//如果数据类型未知,则返回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
    
    如果您尝试在下面这样的开关情况下使用as,它将不起作用。编译器(Swift 1.2 Xcode 6.3b1)说:“不能使用[NSButton]类型的下行模式。”

    称之为限制。将雷达与您的用例一起归档。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")
    }
    

    在操场上试试。希望有帮助!

    尝试使用
    作为?
    但我认为在你的情况下,这是一个编译器错误…报告它!我尝试了可选的,但它不起作用。我同意这可能是一个编译器错误。这不是我见过的第一个与泛型相关的错误…谢谢你的帮助,但我尝试了你的解决方案,但没有用-尽管你的解释n是有帮助的。我意识到数组不能总是向下转换为数组或数组,但这不是switch语句的目的吗?这真的不重要…我认为这是编译器的错误。此外,使用As?运算符只会产生另一个错误。Apple文档(见上面的链接)不使用As?运算符,而仅使用As运算符。
    switch views {
      case let buttons as [NSButton]:
        println("Buttons")
      default:
        println("something else")
    }
    
    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")
    }