Стрімкий вбудований умовний?


78

Як це зробити в Swift?

(someboolexpression ? "Return value 1" : "Return value 2")

(ні, я ще не прочитав цілого посібника ... я, мабуть, пропустив його на сторінці 2!)

Добре, це на сторінці 91, і вищезазначене здається правильним. Однак я намагаюся використовувати це в рядку приблизно так:

println(" some string \(some expression ? "Return value 1" : "Return value 2")"

але компілятор не задоволений. Будь-яка ідея, якщо це можливо, якщо це можливо?

Це так близько, як мені вдалося отримати

let exists = "exists"
let doesnotexist= "does not exist"

println("  something \(fileExists ? exists : doesnotexist)")

Це, мабуть, недогляд у граматиці, і ви можете захотіти подати на неї помилку. Я не перевіряв граматику на це, але варто зауважити, що він не любить екрановані літерали, лише змінні. Тобто. ви не можете зробити це: println ("привіт \ (" світ ")"), але ви можете зробити це: let world = "світ"; println ("привіт \ (світ)"), як ви вже зазначали. Підводячи підсумок, здається, що потрібна змінна, а не вираз.
Chris Conover

Я зроблю це, ура. Тим часом я прийму відповідь @MikeS як найкращий варіант на даний момент
Duncan Groenewald

вам потрібен пробіл після let doesnotexistабо відбудеться помилка препроцесора, і переконайтеся, що ви декларували let fileExists: Boolде-небудь перед printlnтвердженням, яке насправді повинно бути printстаном на Swift 2.0. В іншому випадку я спробував ваш код, він працює чудово
NoodleOfDeath

Відповіді:


135

Якщо ви шукаєте для цього однорядковий вкладиш, ви можете витягнути ?:операцію з інтерполяції рядків і +замість цього об’єднати :

let fileExists = false // for example
println("something " + (fileExists ? "exists" : "does not exist"))

Виходи:

щось не існує


чому це не компіляція для мене? `нехай відповідь = (enterName_text == нуль)? "": enterName_text.text! `
Елад Бенда

@EladBenda, це було б краще не як коментар, а як окреме запитання з деталями щодо того, що таке enterName_text та помилки, яку ви отримуєте. Хоча найкраща здогадка - це те, що ви дійсно хочете: якщо дозволити відповідь = enterName_text? .Text {...}
Mike S

1
Коли я вперше спробував цей тернарний оператор, я думав, що він не працює в Swift. Подивився тут і знайшов цю відповідь. Проблема (що виходить із фону C / C ++) полягала не в тому, щоб поставити пробіл між знаком "?" і перший аргумент. "?" обробляється спеціально в Swift щодо необов’язкових значень, а пробіл дає зрозуміти, що це насправді потрійний оператор.
Джефф Мюр

26

Ви можете скористатися новим оператором Nil-Coalescing , представленим в Swift 3 . Він поверне значення за замовчуванням, якщоsomeOptional є nil.

let someValue = someOptional ?? ""

Тут, якщо someOptionalє nil, цей оператор призначить ""для someValue.


Це така швидка відповідь! Саме те, що я шукав.
dustinrwh

20
var firstBool = true
var secondBool: Bool

firstBool == true ? (secondBool = true) : (secondBool = false)

Якщо в цьому випадку, він змінює secondBool на будь-який першийBool. Це можна зробити також із цілими числами та рядками


10

Його називають « потрійним оператором ».

Що стосується відповіді @ Esqarrouth, я думаю, що кращим форматом буде:

Свіфт 3:

var firstBool = true
var secondBool: Bool

secondBool = firstBool ? true : false

Це те саме, що:

var firstBool = true
var secondBool: Bool

if (firstBool == true) {
    secondBool = true
} else {
    secondBool = false
}

6

Ну,

Якщо ви об'єднуєте умовний з рядком за допомогою оператора +, він повинен працювати.

Тому Майк має рацію.

var str = "Something = " + (1 == 1 ? "Yes" : "No")

6

Ви були так близькі. Просто потрібно було призначити його змінній:

self.automaticOption = (automaticOptionOfCar ? "Automatic" : "Manual")

Редагувати:

Будь-яка ідея, чому цей самий вираз не може бути вбудований у рядок?

Ви можете зробити це:

let a = true
let b = 1
let c = 2

println("\(a ? 1: 2)")

Будь-яка ідея, чому цей самий вираз не може бути вбудований у рядок?
Duncan Groenewald,

Ммм, але це не працює println("something \(automaticOptionOfCar ? "Automatic" : "Manual")")?
Duncan Groenewald,

5

просте рішення, яке я використовував у своїх проектах

Свіфт 3+

var retunString = (state == "OFF") ? "securityOn" : "securityOff"

3

Я використовую вбудований умовний, як це:

Функція isFavorite повертає Boolen

favoriteButton.tintColor = CoreDataManager.sharedInstance.isFavorite(placeId: place.id, type: 0) ? UIColor.white : UIColor.clear

tourOperatorsButton.isHidden = place.operators.count != 0 ? true : false

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.