Swift 为什么这样做有效?在重复循环中添加UILabel

Swift 为什么这样做有效?在重复循环中添加UILabel,swift,uilabel,Swift,Uilabel,我是一个绝对敏捷的初学者,正在尝试构建我的第一个应用程序。当我写一点代码时,我不希望它第一次工作,当它工作时我会怀疑。在一个重复循环中,我在图形上设置线条,并想在线条的左侧添加一个UILabel。我想我可以让一个新的UILabel来创建主视图的子视图,但不知道如何让它为每次迭代创建一个唯一的变量名 repeat { // code to make the lines here // create label with minute number for each

我是一个绝对敏捷的初学者,正在尝试构建我的第一个应用程序。当我写一点代码时,我不希望它第一次工作,当它工作时我会怀疑。在一个重复循环中,我在图形上设置线条,并想在线条的左侧添加一个UILabel。我想我可以
一个新的UILabel来创建主视图的子视图,但不知道如何让它为每次迭代创建一个唯一的变量名

repeat {
        // code to make the lines here

        // create label with minute number for each line
        let minuteLabel = UILabel(frame: CGRectMake(0, 0, 20, 20))

        // code to position the label here

        minuteLabel.text = String(numberOfLines)

        // code to style the label

        self.addSubview(minuteLabel)

        numberOfLines--
    }
    while numberOfLines > 0
我原以为这最终只会创建一个子视图,它的文本将是numberOfLines的最后一次迭代,但它工作得非常好。这是否意味着我的主图形视图现在有(numberOfLines)个UILabel子视图,每个都具有相同的名称

是否可以在该重复循环的范围之外单独访问每个循环


谢谢你帮我理解这一点

首先,视图不按名称引用,因此它们不会都有相同的名称。它们包含在一个数组中,可以通过引用索引来访问该数组。因此,在添加每个子视图时,会将其添加到相应的数组中,例如,可通过以下方式访问:

self.subviews[0]

然后,每个元素都将包含在循环中创建的相同子视图。希望这有助于您澄清。

我认为区分对象的属性和对对象的引用很重要。当您编写“每个具有相同名称的UILabel子视图的数量”时,这不是一个准确的短语,因为这些标签没有名称。对象(在本例中是标签)没有关于它可能存在多少引用或这些引用在编译时可能被命名的信息

在代码示例中,创建一个常量引用
minuteLabel
,并将其指定给指向标签的点。该常数仅存在于该
repeat
循环的一次迭代范围内。在当前循环迭代结束时,该引用将被丢弃。如果没有对标签对象的引用,您可能无法再定位它,但这并不意味着标签不存在。在本例中,您将标签添加为其他视图(
self
)的子视图。该父视图创建了自己对标签的强引用,并且根据该标签的规则,只要存在对该标签的强引用,该标签将继续存在。您甚至可以使用
self.subview
再次找到这些标签,但是由于您不再有对每个标签的引用,您可能很难确定哪个标签是哪个标签

请注意,虽然您提供的引用名称(如
minuteLabel
)对您来说有意义,但对运行您的应用程序的计算机来说,它没有意义,甚至是未知的。该名称帮助我们人类跟踪计算机内存中指向
UILabel
的特定位置,但您将无法使用相同的名称从代码中的其他范围查找相同的标签。你的应用程序可能在不同的范围内有许多名为
minuteLabel
的引用,它们甚至可以指向不同类型的对象,同名并不意味着它们是同一件事

在这样的情况下,您有一个对象集合,希望以后能够再次找到每个对象,一个好的解决方案通常是使用某种集合类型;数组允许您按已知顺序存储对这些标签的引用,然后可以在特定索引中查找标签,字典允许您将对这些标签的引用存储在某个已知的“键”对象下,然后可以使用等效键检索特定标签


尝试为每个对象动态创建常量变量(例如,创建
minuteLabel0
常量然后创建
minuteLabel1
常量的循环,…)不会取得很大成功。如果不清楚原因,那么就有必要建立一个更精确的心智模型,以了解程序的编译和执行阶段之间的差异。

有时代码第一次就可以工作,这也让我感到惊讶。谢谢,这让它更清晰了。在这种情况下,目前我不认为我需要再次引用它们-它们更像是设置和忘记,但我相信在未来我会创建类似的东西,并且会努力找出如何再次访问它们!