Swift中使用"="运算符进行初始化



在Swift中,SIMD类型可以这样初始化:

let x: simd_float2 = [1,2]

即通过在CCD_ 1运算符之后传递数组。

我想知道它是怎么做的。

例如,我有这样的结构(由于我在本论坛其他地方解释的原因(:

struct simd_packed_float3{
var x: Float
var y: Float
var z: Float

init(_ xyz: [Float]){
self.x = xyz[0]
self.y = xyz[1]
self.z = xyz[2]
}

init(_ xyz: simd_float3){
self.x = xyz[0]
self.y = xyz[1]
self.z = xyz[2]
}
}

伪simd结构的初始化程序都不会像本地类型的初始化程序那样工作:

let x: simd_packed_float3 = [1,2,3] // Cannot convert value of type '[Int]' to specified type 'simd_packed_float3'
let y: simd_packed_float3 = simd_float3 // Cannot convert value of type 'simd_float3' (aka 'SIMD3<Float>') to specified type 'simd_packed_float3'

是否可以让初始化程序接受=运算符传递的值,就像使用SIMD类型一样?

您可以通过使类型符合ExpressibleByArrayLiteral来从数组初始化。您需要提供一个类型,即数组中元素的类型和初始化程序。然而,类型通常可以由编译器从初始化程序中推断出来,因此,在实践中,您只需要初始化程序

extension simd_packed_float3: ExpressibleByArrayLiteral
{
init(arrayLiteral: Float...)
{
self.init(arrayLiteral)
}  
}
let x: simd_packed_float3 = [1,2,3]

应该做这个把戏。

这显然只适用于数组文字初始化,而不适用于simd_float3版本,因为语法需要编译器支持。但是要从simd_float3进行初始化,您可以使用以下内容:

let y = simd_packed_float3(simd_float3)

因为您现有的simd_float3 初始化程序

最新更新