Является Java foreach итеративным порядком по примитивам, точно определенным?

Вы можете использовать интерполяцию строки, чтобы включить value в строку.

class Test<T> {
    var value:T
    var name: String

    init(text: String, val: T) {
        name = text
        value = val
    }

    func toString() -> String {
        return "\(name): \(value)"
    }
}

Не имеет отношения к вашей проблеме, но не объявляйте ни одну из ваших переменных как неявно развернутые Необязательные (! после их типа), особенно когда вы устанавливаете их в инициализаторе. Вам также следует соблюдать соглашение об именах Swift, которое для типов является UpperCamelCase (Test).

25
задан double-beep 31 January 2019 в 18:15
поделиться

4 ответа

Согласно JLS, расширенное for оператор , Ваш для цикла эквивалентен

int[] array = a;
for (int index = 0; index < a.length; index++) {
    int i = array[index];
    result += i;
}

, "где array и index сгенерированные компилятором идентификаторы, которые отличны от любых других идентификаторов (сгенерированный компилятором или иначе), которые находятся в объеме в точке, где расширенное for оператор происходит". (немного перефразирование имен переменной здесь).

Так да: порядок абсолютно гарантируется.

46
ответ дан Joachim Sauer 28 November 2019 в 18:29
поделиться

См. раздел 14.14.2 из Спецификации языка Java, 3-й выпуск .

, Если тип Выражения является подтипом Повторяемых, то позволенный я быть типом выражения Expression.iterator (). Расширенное для оператора эквивалентно основному для оператора формы:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
        VariableModifiersopt Type Identifier = #i.next();
   Statement
}

, Где #i является сгенерированным компилятором идентификатором, который отличен от любых других идентификаторов (сгенерированный компилятором или иначе), которые находятся в объеме (В§6.3) в точке, где расширенное для оператора происходит.

7
ответ дан vladr 28 November 2019 в 18:29
поделиться

Это указывает в JLS что:

for ( VariableModifiersopt Type Identifier: Expression) Statement

эквивалентно

T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
        VariableModifiersopt Type Identifier = a[i];
        Statement
}
5
ответ дан Hannele 28 November 2019 в 18:29
поделиться

Я ничего не нашел на странице, на которую Вы сослались, который подразумевал бы неисправное повторение. Можно ли отправить определенную кавычку?

В любом случае, я нахожу что этот код:

public static void main( String args[] ) {
    double a[] = new double[] { 0, 1, 2, 3 };
    int result = 0;
    for ( double i : a ) {
        result += i;
    }

декомпиляции к цикличному выполнению старого стиля:

 public static void main(String args[])
    {
        double a[] = {
            0.0D, 1.0D, 2D, 3D
        };
        int result = 0;
        double ad[];
        int k = (ad = a).length;
        for(int j = 0; j < k; j++)
        {
            double i = ad[j];
            result = (int)((double)result + i);
        }
    }

, Конечно, это не то же как гарантия, но по крайней мере неисправное повторение по массиву было бы очень странным и, будет казаться, будет идти вразрез с очевидной реализацией здравого смысла.

1
ответ дан Steve B. 28 November 2019 в 18:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: