gpt4 book ai didi

swift - 努力理解代码 - 它试图返回数字右侧的十进制数字 'n'

转载 作者:行者123 更新时间:2023-11-28 11:10:27 26 4
gpt4 key购买 nike

我是 Swift 的新手,正在尝试学习扩展的概念。我在“the swift programming language”中看到这段代码,它试图从数字的右边返回'n'位的十进制数字。代码运行良好,但我很难理解代码的实际工作原理。

有人能给我解释一下吗?

extension Int {
subscript(var digitIndex: Int) -> Int {
var decimalBase = 1
while digitIndex > 0 {
decimalBase *= 10
--digitIndex
}
return (self / decimalBase) % 10
}
}

746381295[0]
// returns 5
746381295[1]
// returns 9
746381295[2]
// returns 2
746381295[8]
// returns 7
746381295[9]

最佳答案

扩展通过向现有类型添加功能来工作,但需要注意的是它们不能引入自己的存储。在这种情况下:

/*1*/ extension Int {
/*2*/ subscript(var digitIndex: Int) -> Int {
/*3*/ var decimalBase = 1
/*4*/ while digitIndex > 0 {
/*5*/ decimalBase *= 10
/*6*/ --digitIndex
/*7*/ }
/*8*/ return (self / decimalBase) % 10
}
}

第 1 行将扩展定义为适用于所有 Int 类型。

第 2 行正在为 Int 设置一个新的下标运算符,这将允许您拥有 12345[4] 并产生“某物”。第 3-8 行定义了一些东西。

第 4-8 行中的 while 将 decimalBase 乘以 10,持续“digitIndex”次。这样做有点奇怪,但没关系。结果是如果 digitIndex 为 1,则 decimalBase 为 10;如果是2,十进制是100; 3 是 1000;等等

内容在第 8 行。首先它检索 self。由于扩展适用于 Int,因此 self 将是该整数值。然后它除以 decimalBase,因为它们都是整数,所以任何小数部分都将丢失。因此,在 746381295[2] 的情况下,decimalBase 将为 100,因此您会得到 7463812。然后它使用“%”得到除以 10 的余数。因此 7463812 除以 10 是 746381 2的余数,所以返回值为2。

希望能解释清楚。

先发制人你的问题,我可能会在这种情况下使用for,而不是while:

for _ in 0..<digitIndex {
decimalBase *= 10
}

我没有想太多关于上述循环的频率,它可能运行一次到经常或一次太少,但你明白了。

更好的方法是使用“提升权力”运算符(不太确定它叫什么)。

decimalBase = 10 ^^ digitIndex

那么整个定义可以归结为:

return (self / (10 ^^ digitIndex)) % 10

我会留给你来决定这是否更好。

无论哪种方式,我都不会真正创建这个扩展,我假设它只是为了演示而创建的。

关于swift - 努力理解代码 - 它试图返回数字右侧的十进制数字 'n',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35423454/

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