2016-02-29 11 views
3

Я изучаю Swift с книгой, предназначенной для людей с небольшим опытом. Меня беспокоит синтаксис ++. Следующий берутся из книги:Что означает ++ в Swift?

var counter = 0 
let incrementCounter = { 
    counter++ 
} 
incrementCounter() 
incrementCounter() 
incrementCounter() 
incrementCounter() 
incrementCounter() 

книга говорит, счетчик 5.

, но я напечатал эти коды в игровой площадке Xcode. Это 4!

Я смущен.

+1

счетчика ++ может перевести на counter = counter + 1 или counter + = 1 – Shai

+4

Обратите внимание, что операторы '++' и '--' [будут устаревать в Swift 2.2 и удалены в Swift 3] (https://github.com /apple/swift-evolution/blob/master/proposals/0004-remove-pre-post-inc-decrement.md). – dfri

+3

Не беспокойтесь о ++ и -. Эти операторы устарели и будут удалены из swift 3. – user965972

ответ

1

Пост-инкремент и пост-декремент операторы увеличение (или уменьшение) значение их операнда на 1, но значение выражения является исходное значение этого операнда до приращения (или уменьшения) операции

Поэтому, когда вы видите игровое поле, печатается текущее значение счетчика.

playground

Но после оценки функции, значение счетчика изменений, и вы можете увидеть обновленное значение на следующей строке.

+0

со счетом в последний раз, я получил его. Благодарю. – Tang1230

2

x++ оператор является оператором, который используется на нескольких языках - C, C++, Java (см C answer на тот же вопрос)

Это называется пост-инкремент. Он увеличивает эту переменную на единицу, но после вычисления текущего выражения. Например:

var x = 1 
var y = 2 + x++ 
// the value of x is now 2 (has been incremented) 
// the value of y is now 3 (2 + 1, x has been evaluated before increment) 

Это отличается от ++x (Преинкремента) оператора:

var x = 1 
var y = 2 + ++x 
// the value of x is now 2 (has been incremented) 
// the value of y is now 4 (2 + 4, x has been evaluated after increment) 

Примечания оператора получения удален в следующей версии Swift, так что вы не должны использовать это больше.

Лучше всего просто написать x += 1 вместо сложных выражений с побочными эффектами.

2

Значение counter после пяти ваших звонков в incrementCounter закрытия будет 5, но возвращение каждого вызова incrementCounter будет, казалось бы, «лаг» один шаг позади. Как пишет Sulthan в своем ответе, это связанно с x++ будучи оператором пост-инкремента: результат выражения будет возвращен перед к приращению

var x = 0 
print(x++) // 0 
print(x) // 1 

Кроме того, как я написал в моем комментарии выше , вы не должны использовать операторы ++ и --, так как они будут deprecated in Swift 2.2 and removed in Swift 3. Однако, если вы заинтересованы в деталях оператора post-vs pre-increment, вы можете найти здесь хорошие ответы на SO, помеченные на другие языки, но охватывающие один и тот же объект, например.


Стоит отметить, однако, точка, что является отношение к Swift> 2.1, однако, и что на самом деле не относятся к оператору ++ конкретно.

При запуске Замыкание incrementCounter в

var someOne : Int = 0 
let incrementCounter = { 
    someInt 
} 

Крышку неявно INFERRED быть типа () -> Int: замыкание принимает нулевые аргументы, но с одним возвращением типа Int.

let incrementCounter:() -> Int = { 
    return someInt 
} 

Таким образом, казалось бы, что вы «видеть» в вас игровой площадке неиспользованное (не присвоено) возвращаемое значение вызова incrementCounter закрытия; то есть результат выражения incrementCounter().

enter image description here

В то время как значение counter действительно никогда не печатается в правом блоке вашей игровой площадке (если вы пропишите строку, где результат этой строки: ■ выражение counter).

+0

Я объяснял оператора, и я забыл упомянуть о реальной проблеме ... – Sulthan

+0

dfri, вам нравится решение, которое унарный ++ и/или - будет удалено с языка? см. мой ответ и примечания к нему, пожалуйста :-) – user3441734

+0

@ user3441734 Вы поднимаете некоторые интересные моменты. Однако, надеюсь, что тип вывода для закрытий станет еще лучше в будущем Swift (например, ваш третий блок кода должен скомпилировать и заключить закрытие как '() -> Int'). Лично мне нравится использовать побочные эффекты и, следовательно, выражения, в том числе. например '++', но я полностью понимаю решение Swifts об их устранении, поскольку общая безопасность кода - это плакат-ребенок для Swift, и я считаю, что они хотят включить также защиту от ошибок _logical_ в их объеме. В этом случае «++» и «-» представляют определенную опасность при использовании или чтении кода менее опытными программистами. – dfri

0

Вещь, которую вы делаете, - это шаг за шагом.

Первый Узнайте разницу между Pre & сообщение Increment

  1. В сообщение инкремента, значение счетчика после приращения содержит увеличивается значение(т.е. 5) но если мы вернемся, то она будет содержать старое значение(т.е. 4).
  2. В предварительном приращении увеличивается значение и возвращаемое значение.

Давайте посмотрим на код сейчас,

counter++ делает копию, увеличивает счетчик, и возвращает копию (старое значение).

так что если вы печатаете счетчик он будет увеличиваться значение (т.е. 5) но, если вы вернете счетчик (т.е. ваш делать это с incrementCounter) содержит старое значение (т.е. 4).

, из-за которых incrementCounter только отображается до 4.

ПРОВЕРКА ВЫХОДА enter image description here Решение:

изменение counter++ к ++counter

ПРОВЕРКА ВЫХОДА enter image description here

1

несмотря на то, что есть много ответов, и все они являются ясно, я добавил этот sni ppet, чтобы показать вам, как заменить код «новым» синтаксисом, где ++ и/- устарели. сначала ваш собственный код

var counter = 0 
let incrementCounter = { 
    counter++ 
} 
let i0 = incrementCounter() // 0 
let i1 = incrementCounter() // 1 
// ..... 

как его переписать в будущем синтаксис Swift? попробуйте рекомендуемую замену ...

var counter = 0 
let ic = { 
    counter += 1 
} 
let i0 = ic() //() aka Void !!! 
let i1 = ic() //() 

но теперь результат ic() недействителен! Хм ... Хорошо, следующая попытка может выглядит

var counter = 0 
let ic = { 
    counter += 1 
    return counter 
} 

но теперь код не компилируется с ошибкой: не в состоянии вывести тип возвращаемого закрытия в текущем контексте :-), поэтому мы должны объявить его (в нашей первоначальной версии это не было необходимо)

var counter = 0 
let ic:()->Int = { 
    counter += 1 
    return counter 
} 
let i0 = ic() // 1 
let i1 = ic() // 2 
// ..... 

Работает, но результаты не совпадают. это потому, что в исходном коде оператор ++ использовался как оператор post-increment. так, нам нужно другое регулирование наших «новых» версии

var counter = 0 
let ic:()->Int = { 
    let ret = counter 
    counter += 1 
    return ret 
} 
let i0 = ic() // 0 
let i1 = ic() // 1 
// ..... 

да, я хотел бы видеть мой знакомый унарную ++ и/или - будет также в будущих версиях Swift

 Смежные вопросы

  • Нет связанных вопросов^_^