我已经得到了将其转换为Swift的一部分代码,但我不太确定代码是用.net、c#还是java编写的。
这是代码
public static int calculate(string number) {
string text = number.ToString();
for (int i = 0; i < text.Length; i++) {
int num = Convert.ToInt32((int)(text[text.Length - i - 1] - '0'));
}
}我尝试这样做,但没有得到预期的结果。
func calculate(_ number: String) -> Int {
let text = number
for i in 0..<text.count {
let num = Int(text.substring(text.count - i - 1).trimmingCharacters(in: CharacterSet(charactersIn: "0"))) ?? 0
}
}我不介意告诉我它会是什么样子,我只是想知道这行代码是做什么的,这样我就可以把它转换成swift了。
Int(text.substring(text.count - i - 1).trimmingCharacters(in: CharacterSet(charactersIn: "0"))) ?? 0
另外,他为什么要这样做:string text = number.ToString();
因为函数有一个字符串参数,所以在它旁边加上toString不也是一样的吗?(也许为了让代码更清晰?)
提前感谢
发布于 2018-05-31 01:54:33
我不知道斯威夫特,但我可以解释C#代码...这是非常复杂的,可以大大减少...
让我们从第一行开始:
string text = number.ToString();这会将数字转换为字符串,因此假设数字为123450,它将其转换为"123450"。在您的示例中不需要它,因为number已经作为string传入,所以可以完全省略.ToString()而不会影响任何东西。
现在是for循环:
for (int i = 0; i < text.Length; i++) {
int num = Convert.ToInt32((int)(text[text.Length - i - 1] - '0'));
}它将迭代字符串中的每个字符,循环可以通过更好地使用for-loop参数来简化:
for (int i = text.Length - 1; i >= 0; i--) {
int num = Convert.ToInt32((int)(text[i] - '0'));
}会更容易阅读,但我们将继续使用原始代码...
忽略这在上面的上下文中实际上是无效的,让我们假设您在循环中使用num做了一些事情,以使它变得有价值。
让我们来分析一下:
text[text.Length - i - 1] - '0'正在做一些"ASCII数学运算“来得出一个数字。ASCII数字从十进制48开始,因此'0'等同于值48。因此,对于第一次迭代:
text[text.Length (6) - i (0) - 1 = 5] = '0' - '0' = 0Convert.ToInt32在这里是多余的,因为'0' - '0'的结果是0的整数值。前面的cast (int)也是多余的,因此这一整行代码可以简化为:
int num = text[text.Length - i - 1] - '0';所以这就更有意义了。你可以用另一种方式来写它:
int num = Convert.ToInt32(text[text.Length - i - 1]) - 48;因此,它基本上将字符'0'转换回数字0,依此类推,所有数字从0到9。如果number是浮点值,此代码将中断(给出不准确的结果)。
我知道这里的练习是将其转换为另一种语言,但在C#中,整个for循环可以简化为:
public static int calculate(string number)
{
var reverseNums = number.ToCharArray().Reverse().Select(c => c - '0').ToList();
//Do whatever on the reverseNums
}https://stackoverflow.com/questions/50610577
复制相似问题