.Net / C # Объяснение - PullRequest
0 голосов
/ 30 мая 2018

Мне дали часть кода для преобразования его в 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();

Поскольку функция имеет строковый параметр isnРазве это не то же самое, чтобы поставить toString рядом с ним?(может быть, код будет более понятным?)

Заранее спасибо

1 Ответ

0 голосов
/ 30 мая 2018

Я не знаю Swift, но я могу объяснить код 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 лучше:

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' = 0

Convert.ToInt32 здесь избыточно, потому что результат '0' - '0' является целочисленным значением 0.Приведение (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    
}
...