gpt4 book ai didi

swift - 在 Swift 中将实例变量别名为其他实例变量的更简单方法?

转载 作者:搜寻专家 更新时间:2023-10-31 19:29:33 30 4
gpt4 key购买 nike

鉴于 Swift 中的以下 struct,是否有更简洁的方法来别名实例变量 xy z 到三元组的属性,_v?

注意:我意识到,当然,我可以将这些实例变量声明为 Double 而不需要元组。但是,我这样做的原因是我可以用单行语句设置三个变量,就像您将在 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)

类(class):

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)
}
}
}

那当然不行。但是是否有另一种方法可以达到同样的效果?

最佳答案

恰恰相反!

I realize that, of course, I could just declare these instance variables as Doubles and not need the tuple. However, the reason I'm doing it this way is so I can set three variables with a single-line statement like you will see in the init method and the below sample code.

如果是这个原因就反其道而行之

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)

最后的说明

您的初始化程序可以通过多种方式进行改进。

  1. 停止使用 NSArray,你使用的是 Swift 而不是 Objective-C
  2. 停止使用 isKindOfClass,使用 as? 执行条件转换
  3. 您相信第一个数组中的对象将具有 doubleValue 属性。所以我可以很容易地让你的 init 崩溃,传递一些不同的东西,对吗?

现在我的问题

成员结构初始化器有什么问题?

当您没有明确定义结构的初始化程序时,它会自动生成,就像我之前截取的代码一样。

您确定要定义一个接受任何类型对象的初始值设定项,并且会因 99.99% 的值组合而崩溃吗?

关于swift - 在 Swift 中将实例变量别名为其他实例变量的更简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38425049/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com