2014-12-05 4 views
2

Есть ли способ в Swift назначить условные выражения, подобные этимНазначить условное выражение в Swift?

let foo = if (bar == 2) { 
     100 
    } else { 
     120 
    } 

(или с корпусом выключателя).

(Не нужно использовать для этого тройной оператор).

Этот тип присвоения хорош для функционального стиля/неизменности. В этом случае выражения имеют возвращаемое значение.

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

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

+0

«Не хочу использовать тройной оператор для этого» Что ?! Зачем? – Biffen

+0

Потому что тернарный оператор может стать быстро нечитаемым и, скорее, негибким (по сравнению, по крайней мере, с корпусом коммутатора). – Ixx

+2

почему бы и нет: 'let foo = (bar == 2)? 100: 120'? – holex

ответ

8

Вы можете использовать замыкание для инициализации непреложного:

let foo: Int = { 
    if bar == 2 { 
     return 100 
    } else { 
     return 120 
    } 
}() 

Преимущества использования закрытия является то, что это функция, так что вы можете использовать любую сложную логику внутри, реализованную в чистом виде, а не через вложенных тройных операторов. Это может быть оператор switch, его можно получить как возвращаемое значение функции, за которым следуют некоторые вычисления, это может быть случай соответствия шаблону, это может быть комбинация из всех них и т. Д.

Сказал иначе , это то же самое, что и инициализация с возвращаемым значением функции, но разница в том, что функция является встроенной, а не где-то еще, с преимуществами чтения.

Просто для полноты, если переменная изменяемые, вы можете использовать отложенную инициализацию:

var foo: Int 

// Any statement here 

if bar == 2 { 
    foo = 100 
} else { 
    foo = 120 
} 

// Other statements here 

myFunc(foo) 

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

Update: Так как Swift 2.0, отложила инициализация также работает с immutables.

+0

Я не говорю, что этот ответ неправильный, но как это лучше, чем троичный? – Biffen

+0

Это не лучше, все по-другому. Если у меня есть 2 варианта, я предпочитаю тройку. Закрытие вместо этого позволяет инициализировать переменную сложными и многострочными операторами - вы можете использовать 'switch', вы можете вызвать функцию, возвращающую значение, выполнить некоторые вычисления на нем и вернуть результат и т. Д. – Antonio

+0

Рад слышать ни я ни мир не сходят с ума. – Biffen

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