在Swift中给出以下 struct ,是否有更简洁的方法将实例变量x
,y
和z
别名为属性三元组_v
?
注意:我意识到,当然,我可以将这些实例变量声明为双精度而不需要元组。但是,我这样做的原因是我可以使用单行语句设置三个变量,就像您将在init
方法和下面的示例代码中看到的那样。
所需输出为“1.0”“4.0”的示例代码:
var myVector = Vector3([1.0,2.0,3.0])
let x = myVector.x
print(x)
myVector.v = (4.0,5.0,6.0)
print(x)
班级:
struct Vector3 {
typealias V3 = (x:Double,y:Double,z:Double)
var v:V3 = (x:0.0,y:0.0,z:0.0)
var x:Double {
get {
return v.x
}
set(x) {
v.x = x
}
}
var y:Double {
get {
return v.y
}
set(y) {
v.y = y
}
}
var z:Double {
get {
return v.z
}
set(z) {
v.z = z
}
}
init(_ args:AnyObject...) {
if(args[0].isKindOfClass(NSArray)) {
v = (args[0][0].doubleValue,args[0][1].doubleValue,args[0][2].doubleValue)
}
else if(args.count == 3){
v = (args[0].doubleValue,args[1].doubleValue,args[2].doubleValue)
}
}
}
我希望能做的是:
struct Vector3 {
typealias V3 = (x:Double,y:Double,z:Double)
var v:V3 = (x:0.0,y:0.0,z:0.0)
alias x = v.x
alias y = v.y
alias z = v.z
init(_ args:AnyObject...) {
if(args[0].isKindOfClass(NSArray)) {
v = (args[0][0].doubleValue,args[0][1].doubleValue,args[0][2].doubleValue)
}
else if(args.count == 3){
v = (args[0].doubleValue,args[1].doubleValue,args[2].doubleValue)
}
}
}
当然这不起作用。但还有另一种方法可以实现同样的目标吗?
答案 0 :(得分:3)
我意识到,当然,我可以将这些实例变量声明为双精度而不需要元组。但是,我这样做的原因是我可以用单行语句设置三个变量,就像你将在init方法和下面的示例代码中看到的那样。
如果这是原因,那就做相反的
struct Vector3 {
var x: Double
var y: Double
var z: Double
var coordinates: (Double, Double, Double) {
set { (x, y, z) = newValue }
get { return (x, y, z) }
}
}
var vector = Vector3(x: 1, y: 2, z: 3)
vector.x = 4
vector.coordinates // (4, 2, 3)
您的初始化程序可以通过多种方式进行改进。
isKindOfClass
,使用as?
执行条件转换doubleValue
属性。所以我很容易让你的init
通过一些不同的东西?成员结构初始化程序有什么问题?
当您没有明确定义结构的初始值设定项时,它会自动生成,就像我之前的代码剪切一样。
你确定你想要定义一个初始化器,它真的接受任何类型的对象,会崩溃99.99%的值可以传递给它的值组合吗?