Используйте двойное название кнопки в Swift - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь получить текст выбранного элемента PopupButton, привести его к двойному типу и выполнить с ним некоторые математические операции.

После прочтения и просмотра руководств по дополнительным функциям я все еще могу обдумать, что Xcode хочет от меня, а именно:

let foo = Double((stundenPopup.selectedItem?.title)!)!*0.20;

(где кнопка Popup была заполнена на viewDidLoad, и она не изменяется) как я читал, это не очень хорошая практика! операторы здесь и там. Если я правильно понял, то! Оператор заставляет развернуть. Чего я не понимаю, так это почему?, Делая выбранный элемент необязательным, а второй -

Может кто-нибудь показать мне свет здесь? Было бы очень признательно ...

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

let foo = Double((stundenPopup.selectedItem?.title)!)!*0.20; можно читать следующим образом:

studentPopup имеет свойство под названием selectedItem. Если selectedItem 's title свойство не nil, доступ к нему. Я предполагаю, что title также является необязательным. Таким образом, все полученное выражение будет необязательным. Разверните необязательно. Но я хочу, чтобы весь результат этого выражения в Double. Итак, используйте конструктор Double s. Но, ох! Конструктор Double возвращает необязательный тип. Таким образом, разверните необязательный, чтобы получить Double необязательный. Умножьте на 0,20, присвойте ему foo. Готово.

Причина, по которой selectedItem может быть необязательной, заключается в том, что человек, который спроектировал тип stundenPopup, с ее наилучшим суждением, считает, что есть реальный шанс, что selectedItem может иметь значение nil в какой-то момент его жизненного цикла.

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

0 голосов
/ 27 апреля 2018

Для приведения типов нельзя использовать дополнительные значения.
То, что вы можете сделать, это:

guard let title = stundenPopup.selectedItem?.title else { /* title is nil */ return }
// now the title is not optional anymore
guard let double = Double(title) else { /* title is not a Double */ return }
// now you've successfully cast the title into a Double
let foo = double*0.2

Обратите внимание, что если guard-let операторы потерпят неудачу, остальные функции не будут вызваны. Если вы хотите продолжить свою функцию после операторов, вы можете использовать if-let s:

if let title = stundenPopup.selectedItem?.title {
    // now the title is not optional anymore
    if let double = Double(title) {
        // now you've successfully cast the title into a Double
        let foo = double*0.2
    }
}

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

// if the title cannot be cast to Double, foo will be 0*0.2 which is still 0
let foo = (Double(stundenPopup.selectedItem?.title ?? "") ?? 0)*0.2
...