Я пытаюсь использовать эти строки кода
class Student {
var name: String
var age: Int?
init(name: String) {
self.name = name
}
func description() -> String {
return age != nil ? "\(name) is \(age) years old." : "\(name) hides his age."
}
}
var me = Student(name: "Daniel")
println(me.description())
me.age = 18
println(me.description())
Приведенный выше код дает следующее
Daniel hides his age.
Daniel is Optional(18) years old.
У меня вопрос, почему там есть Optional (18), как я могу удалить необязательный и просто распечатать
Daniel is 18 years old.
if let age = age { return ""} else { return "" }
Many Swift beginners think var age: Int? means that age is an Int which may or may not have a value. But it means that age is an Optional which may or may not hold an Int.
Необязательный параметр означает, что Swift не совсем уверен, соответствует ли значение типу: например, Int? означает, что Swift не совсем уверен, является ли число Int.
1) Если вы абсолютно уверены в типе, вы можете использовать восклицательный знак, чтобы принудительно развернуть его, например:
Если вы принудительно развернете необязательный параметр, и он равен nil, вы можете столкнуться с этой ошибкой сбоя:
Это не обязательно безопасно, поэтому вот метод, который может предотвратить сбой, если вы не уверены в типе и значении:
2) Неявно развернутый необязательный
3) Заявление охранника
Отсюда вы можете продолжить и использовать развернутую переменную. Убедитесь, что развернули только принудительно (с помощью символа!), Если вы уверены в типе переменной.
источник
В целях тестирования / отладки я часто хочу выводить опциональные параметры в виде строк без необходимости всегда проверять
nil
значения, поэтому я создал собственный оператор.Я улучшил ситуацию еще больше после прочтения этого ответа в другом вопросе .
Очевидно, что оператор (и его атрибуты) можно настроить по своему усмотрению или вместо этого сделать его функцией. В любом случае, это позволяет вам писать такой простой код:
Интеграция идеи протокола другого парня сделала так, что это работает даже с вложенными опциями, которые часто возникают при использовании опциональной цепочки. Например:
источник
String
другое место (например, журнал / сообщение об ошибке).Обновить
Просто используйте
me.age ?? "Unknown age!"
. Работает в 3.0.2.Старый ответ
Без принудительного разворачивания (нет сигнала mach / сбой, если nil) еще один хороший способ сделать это:
(result["ip"] ?? "unavailable").description
,result["ip"] ?? "unavailable"
тоже должна работать, но ее нет, по крайней мере, не в 2.2Конечно, замените «недоступный» на то, что вам подходит: «ноль», «не найдено» и т. Д.
источник
Чтобы развернуть необязательное использование
age!
вместоage
. В настоящее время вы печатаете необязательное значение, которое может бытьnil
. Вот почему его обернулиOptional
.источник
В быстром
Optional
- это то, что может бытьnil
в некоторых случаях. Если вы на 100% уверены, что avariable
всегда будет иметь какое-то значение и не вернетnil
добавленное!
с переменной, чтобы принудительно развернуть его.В другом случае, если вы не очень уверены в ценности, добавьте
if let
блок илиguard
убедитесь, что значение существует, иначе это может привести к сбою.Для
if let
блока:Для
guard
заявления:guard
условная структура для возврата управления, если условие не выполняется.Я предпочитаю использовать
guard
overif let
block во многих ситуациях, поскольку он позволяет нам возвращать,function
если определенное значение не существует. Например, когда есть функция, в которой существует интегральная переменная, мы можем проверить ее в операторе защиты, и ее возврат не существует. то есть;Если переменная существует, мы можем использовать abc в функции за пределами области защиты.
источник
age
является необязательным типом:Optional<Int>
поэтому, если вы сравниваете его с nil, он каждый раз возвращает false, если он имеет значение или нет. Вам нужно развернуть необязательное, чтобы получить значение.В вашем примере вы не знаете, содержит ли он какое-либо значение, поэтому вы можете использовать это вместо:
источник
Я сделал это, чтобы распечатать значение строки (свойства) из другого контроллера представления.
ViewController.swift
SecondViewController.swift
Результат:
источник
Ознакомьтесь с
guard
заявлением:источник
При наличии значения по умолчанию:
print("\(name) is \(age ?? 0) years old")
или если имя необязательно:
print("\(name ?? "unknown") is \(age) years old")
источник
Я получал Optional («String») в своих ячейках tableview.
Первый ответ отличный. И помог мне разобраться. Вот что я сделал, чтобы помочь таким новичкам, как я.
Поскольку я создаю массив в своем настраиваемом объекте, я знаю, что в нем всегда будут элементы в первой позиции, поэтому я могу принудительно развернуть его в другую переменную. Затем используйте эту переменную для печати или, в моем случае, установите текст ячейки tableview.
Сейчас это кажется таким простым, но мне потребовалось время, чтобы сообразить.
источник
Это не точный ответ на этот вопрос, но одна из причин такого рода проблем. В моем случае мне не удалось удалить Optional из String с помощью «if let» и «guard let».
Так что используйте AnyObject вместо Any чтобы быстро удалить optional из строки.
Пожалуйста, обратитесь к ссылке для ответа.
https://stackoverflow.com/a/51356716/8334818
источник