2016-04-18 3 views
3

В this приложения есть утверждение:Swift Особенного Закрытия Синтаксис

var instanceCount = { globalHappinessInstanceCount++ }() 

Пытаясь понять приведенное выше утверждение, я обнаружил, что, насколько я проверил, заявление ниже достигает тот же результат:

var instanceCount = globalHappinessInstanceCount++ 

Q1. Какое первое утверждение достигается тем, что второе не делает?

Q2. Являются ли() фигурные скобки после выражения закрытия, означающего пустой кортеж, синтаксис инициализатора ... или что? I. Как следует прочитать первое утверждение?

ответ

1

Q1. Какое первое утверждение достигается тем, что второе не делает?

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

Q2. Являются ли() фигурные скобки после выражения закрытия, означающего пустой кортеж, синтаксис инициализатора ... или что? I. Как следует прочитать первое утверждение?

Это метод call. Так же, как

let foo = { globalHappinessInstanceCount++ } 
foo() 

Update:

Я просто прочитать код в вашей ссылке, в контексте области видимости класса, она отличается.

class HappinessViewController 
{ 
    var instanceCount = { globalHappinessInstanceCount++ }() 
} 

определяет свойство instanceCount: Int, которые получают назначенное значение globalHappinessInstanceCount++

Это не сильно отличается, чем var instanceCount = globalHappinessInstanceCount++

Однако в Swift 3 ++ оператора будет удален, который вы можете захотеть изменить до globalHappinessInstanceCount += 1. Но вопрос является результатом типа += оператором является Void вместо Int. Поэтому вы должны написать это как

class HappinessViewController 
{ 
    var instanceCount: Int = { 
     let instanceCount = globalInstanceCount 
     globalInstanceCount += 1 
     return instanceCount 
    }() 
} 
+0

Так что даже в классе scope есть первое заявление, по-прежнему использующее ненужное закрытие? –

+0

Я думаю, нам нужно defer {globalHappinessInstanceCount + = 1}, потому что ++ постфикс. –

+0

Итак, теперь для Swift 3, устаревшего ++, нам нужно добавить спецификацию типа Int, блок отсрочки и оператор возврата. Может ли это быть достаточной причиной для давления на отмену устаревшего решения оператора? –

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