gpt4 book ai didi

swift - 方法如何访问调用者的属性?

转载 作者:行者123 更新时间:2023-11-30 12:21:38 24 4
gpt4 key购买 nike

我有一个具有 2 个属性的结构,它们相互依赖。可以通过将它们中的任何一个作为参数传递来创建实例,然后初始化程序将调用一个函数来计算相应的另一个。此计算需要另一个变量的值,该变量在我的 Playground 顶部声明为全局变量:

var grid: Int = 8

struct myStruct {
var valueAsTuple: (Int,Int,Int)
var valueAsInt: Int

init(_ value: (Int,Int,Int)) {
self.valueAsTuple = value
self.valueAsInt = 0
self.valueAsInt = getIntFromTuple(value)
}

init(singleInt: Int) {
self.valueAsTuple = (0,0,0)
self.valueAsInt = singleInt
self.valueAsTuple = getTupleFromInt(singleInt)
}

func getIntFromTuple(tuple: (Int,Int,Int)) -> Int {

// do some math using the global grid variable

return result
}

func getTupleFromInt(int: Int) -> (Int,Int,Int) {

// do some math using the global grid variable

return result
}
}

这在 Playground 上效果很好。但是,最终 myStruct 永远不会用作单个实例,但另一个结构将保存 myStructs 数组。这个封装结构体将有一个属性“grid”,在计算 myStruct 的属性时应该使用这个属性。

可以创建封装属性的多个实例,每个实例都具有不同的“grid”值,因此在外部结构的一个实例中创建的 myStruct 实例将获得不同的结果属性而不是在不同实例中创建的属性。

我是面向对象编程的新手,所以我仍在学习如何组织我的代码以实现我的特定目标。

我尝试将 myStruct 嵌套到外部结构中,但收到错误:“实例成员“grid”不能在类型“myStruct”上使用。

将网格变量更改为静态会使嵌套结构看到它,但这将导致无法为外部结构的每个实例提供不同的网格值。

那么,简而言之,对必须使用其周围范围的属性的对象进行编码的快速方法是什么?

编辑:

我尝试举一个更清晰的例子:

假设您有很多鸡蛋,并且想将它们存储在盒子中。一个鸡蛋可以有一个绝对数量(m),并且它可以是(o)框中的第(n)个鸡蛋。您可以告诉初始化器将鸡蛋存储在绝对位置(m),或特定盒子的特定位置。

现在有一些盒子可以容纳 6 个鸡蛋,这样可以容纳 10 个。当然,我可以在每次初始化新鸡蛋时传递盒子容量(“网格”值),但我正在寻找的是让初始化器知道我想要附加到的数组的框大小的便捷方法:

shelfWithSmallBoxes.boxesArray.append(21)
// now there is an egg at absolute position 21
print(shelfWithSmallBoxes.boxesArray.last.asTuple

shelfWithLargeBoxes.boxesArray.append(21)
// also here is an egg at absolute position 21
print(shelfWithLargeBoxes.boxesArray.last.asTuple

the first result should be (4,3), as the egg would be placed in the 4th box at position 3, the second result should be (3,1)

我认为,这不是一个太奇特的问题,我只是太新手,无法判断哪种方法是最佳实践。

最佳答案

一种可能的解决方案是将 valueAsTuplevalue 之间的计算移至父结构。看起来您正在存储网格索引,并且计算取决于网格大小。

这类似于 Swift 中现有的 Collection API,其中集合使用以下函数对其索引进行数学计算:

collection.index(after: anIndex)
collection.distance(from: anIndex, to: anotherIndex)
<小时/>

其他可能性是:

  1. grid 变量作为实例变量包含在 MyStruct 中。
  2. MyStruct 中存储对父类型的引用(仅当父类型是类时才有效)
  3. grid存储在父结构中,并将其传递给每个需要它的函数调用。

关于swift - 方法如何访问调用者的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44722505/

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