【发布时间】:2017-06-23 13:21:55
【问题描述】:
我有一个具有 2 个属性的结构,它们相互依赖。可以通过将其中任何一个作为参数传递来创建一个实例,然后初始化程序将调用一个函数来计算相应的另一个。此计算需要另一个变量的值,该变量在我的操场顶部声明为全局变量:
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
}
}
这在操场上运行良好。然而,最后 myStruct 永远不会被用作单个实例,而是另一个结构将保存一个 myStructs 数组。这个封装结构会有一个属性“grid”,在计算myStruct的属性时应该使用这个属性。
可以创建封装属性的多个实例,每个实例都具有不同的“网格”值,因此在外部结构的一个实例中创建的 myStruct 实例将在另一个实例中得到不同的结果属性比在不同实例中创建的属性。
我是面向对象编程的新手,所以我仍在学习如何组织我的代码以实现我的特定目标。
我试图将 myStruct 嵌套到外部结构中,但出现错误:“实例成员 'grid' 不能用于类型 'myStruct'。
将 grid var 更改为 static 会使嵌套结构看到它,但这将无法为外部结构的每个实例赋予不同的网格值。
那么,简而言之,对必须使用其周围范围属性的对象进行编码的快速方法是什么?
编辑:
我试着举一个更清楚的例子:
假设你有很多鸡蛋,你想把它们存放在盒子里。一个鸡蛋可以有一个绝对数(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)
我认为,这不是一个太奇特的问题,我只是太新手,无法判断哪种方法是最佳实践。
【问题讨论】:
-
你的描述让我很困惑。你想:(a) 将一个
myStructs 数组包装在一个外部结构中,并且 (b) 让它们共享对同一个grid变量的访问吗? -
是的,这是我的意图。