Тема 1: Неустранимая ошибка: Неожиданно найдено нуль при развертывании Необязательное значение - Галерея swift [дубликат]

Самая новая версия C # - C # 7.1 позволяет создавать консольное приложение async. Чтобы включить C # 7.1 в проекте, вам необходимо обновить VS до не менее 15.3 и изменить версию C # на C# 7.1 или C# latest minor version. Для этого перейдите в Свойства проекта -> Сборка -> Дополнительно -> Языковая версия.

После этого будет работать следующий код:

internal class Program
{
    public static async Task Main(string[] args)
    {
         (...)
    }
295
задан 8 revs, 5 users 58% 19 May 2018 в 14:26
поделиться

7 ответов

[11175] Этот ответ

wiki сообщества

. Если вы чувствуете, что это может быть улучшено, не стесняйтесь

отредактируйте его

! [11175] [11156] Предыстория: что является дополнительным? [11156] [11176] В Swift

[ 1126]

является

общим типом

, который может содержать значение (любого вида) или вообще не имеет значения. [11176] [11177] Во многих других языках программирования особое значение «дозорного» часто используется для указания отсутствия
  • значения
  • . В Objective-C, например, (нулевой указатель

    ) указывает на отсутствие объекта. Но это становится более сложным при работе с примитивными типами - следует ли использовать
    , чтобы указать отсутствие целого числа, или, возможно, или какое-либо другое целое число? Если какое-либо конкретное значение выбрано так, чтобы оно означало «no integer», это означает, что он больше не может считаться значением
  • . [11177] [11178] Swift - это безопасный тип языка, что означает, что язык помогает вам четко понимать типы ценностей, с которыми может работать ваш код. Если часть вашего кода ожидает String, тип безопасности предотвращает передачу Int Int по ошибке. [11178] [11179] В Swift [11250]
  • любой тип
  • можно сделать необязательным [11250]. Необязательное значение может принимать любое значение от исходного типа

  • или
  • специальное значение
    . ​​[11179] [11180] Опционы определяются с суффиксом типа: [11180] [11181] Отсутствие значения в необязательном указывается в : [11181] [11182] < sup> (Обратите внимание, что это не совпадает с в Objective-C. В Objective-C имеется отсутствие действительного указателя объекта
  • , в Swift, Optionals (11116) Возможно,

    .) [11182]


    [11157] Почему я получил «
  • фатальную ошибку: неожиданно найден nil в то время как разворачивание необязательного значения
  • "? [11157] [11183] Чтобы получить доступ к необязательному значению (если оно есть вообще), вам нужно [11251] развернуть [11251] его. Необязательное значение может быть развернуто безопасно или принудительно. Если вы принудительно развернете опцию, и она
      не имеет значения
    , ваша программа выйдет из строя с указанным выше сообщением. [11183] [11184] Xcode покажет вам сбой, выделив строку кода. Проблема возникает в этой строке. [11184] [11185]

    [11170] [11170]

    [11185] [11186] Этот сбой может происходить с двумя различными видами развязывания силы: [11186] [11162] 1. Explicit Force Unwrapping [11162] [11187] Это делается с оператором
    на опциональном. Например: [11187] [11188] Как здесь здесь , вы получите крушение на линии, где вы принудительно разворачиваете его. [11188] [11163] 2. Неявно отключенные опции [11163] [11189] Они определены с помощью , а не после типа. [11189] [11190] Предполагается, что эти дополнительные элементы содержат значение. Поэтому всякий раз, когда вы получаете доступ к неявно развернутому факультативному, он автоматически будет принудительно развернут для вас. Если он не содержит значения, он сработает. [11190] [11191] Чтобы определить, какая переменная вызвала сбой, вы можете удерживать ⌥ , показывая это определение, где вы можете найти необязательный тип. [11191] [11192] [11171] [11171] [11192] [11193] IBOutlets, в частности, обычно являются неявно развернутыми опциями. Это связано с тем, что ваш xib или раскадровка свяжет выходы во время выполнения
      после
    инициализации. Поэтому вы должны убедиться, что вы не получаете доступ к розеткам до их загрузки. Вы также должны проверить правильность соединений в вашем файле раскадровки / xib, в противном случае значения будут

    во время выполнения и, следовательно, сбой, когда они неявно разворачиваются. [11193]
    [11158] Когда мне нужно принудительно развернуть Необязательный? [11158] [11164] Explicit Force Unwrapping [11164] [11194] Как правило, вы никогда не должны принудительно принудительно разворачивать опцию с помощью оператора

    . Могут быть случаи, когда использование

    приемлемо - но вы должны использовать его только когда вы на 100% уверены, что опционально содержит значение. [11194] [11195] Хотя
      может
    быть местом, где вы можете использовать развертывание силы, как вы знаете для факта [11141] [11141], что необязательный содержит значение - нет [11142] одиночного [ 11142], где вы не можете безопасно разворачивать эту опцию вместо этого. [11195] [11196]
    [11196] [11165] Неявно разобранные опции [11165] [11197] Эти переменные сконструированы так, что вы можете отложить их назначение до более позднего времени в своем коде. Это [11143] ваша [11143] ответственность за то, чтобы они имели ценность, прежде чем вы к ним обращались. Однако, поскольку они связаны с развертыванием силы, они по-прежнему по своей сути небезопасны, поскольку они [11144] предполагают, что [11144] ваша ценность не равна нулю, хотя присвоение значения nil действительно. [11197] [11198] Вы должны использовать неявно развернутые опции как [11145] в последней инстанции [11145]. Если вы можете использовать

    ленивую переменную

    или предоставить значение по умолчанию

    по умолчанию

    для переменной - вы должны сделать это вместо использования неявно развернутого необязательного. [11198] [11199] Однако существует несколько сценариев

    , в которых неявно развернутые опции являются полезными

    , и вы все еще можете использовать различные способы безопасного их развертывания, как указано ниже, но вы должны [11146] всегда [11146] используйте их с должной осторожностью. [11199]
    [11159] Как я могу безопасно иметь дело с опциями? [11159] [11200] Самый простой способ проверить, содержит ли опциональное значение, сравнить его с

    . [11200] [11201] Однако в 99,9% случаев, когда вы работаете с опциями, вы действительно захотите получить доступ к содержащемуся в нем значению, если он содержит один. Для этого вы можете использовать [11147] Необязательное связывание [11147]. [11201] [11166] Необязательное связывание [11166] [11202] Необязательное связывание позволяет проверить, содержит ли опциональное значение значение, и позволяет назначить развернутое значение новой переменной или константе. Он использует синтаксис

    или

    , в зависимости от необходимости изменения значения новой переменной после привязки к ней. [11202] [11203] Например: [11203] [11204] Что это значит, сначала проверьте, что опция содержит значение. Если он [11148] делает [11148], то «развернутое» значение присваивается новой переменной (

    ), которую вы можете свободно использовать, как если бы она не была необязательной. Если в необязательном [11149] не указано значение [11149], то будет предложено предложение else, как и следовало ожидать. [11204] [11205] Что отличное от необязательного связывания, вы можете одновременно развернуть несколько опций. Вы можете просто отделить инструкции запятой. Заявление будет выполнено, если все дополнительные опции были развернуты. [11205] [11206] Еще один опрятный трюк заключается в том, что вы можете также использовать запятые, чтобы проверить какое-то условие на значение после его разворачивания. [11206] [11207] Единственный улов с использованием необязательного связывания в выражении if состоит в том, что вы можете получить доступ к развернутому значению из области действия инструкции. Если вам нужен доступ к значению из-за пределов области действия инструкции, вы можете использовать инструкцию [11150] guard [11150]. [11207] [11208] Инструкция

    охранника

    позволяет вам определить условие для успеха - и текущая область действия будет продолжать выполнение только в том случае, если это условие выполнено. Они определены с синтаксисом

    . [11208] [11209] Итак, чтобы использовать их с необязательной привязкой, вы можете сделать это: [11209] [11210] (Обратите внимание, что внутри тела охранника вы [11252] должны [11252] использовать один из

    управляет передающими операторами

    , чтобы выйти из области текущего исполняемого кода). [11210] [11211] Если

    содержит значение, оно будет развернуто и назначено новому [ 1150] константа. После этого код [11151] после [11151] охранник продолжит выполнение. Если он не содержит значения - защитник выполнит код в скобках, что приведет к передаче управления, так что код сразу после этого не будет выполнен. [11211] [11212] Настоящая опрятная информация о сторожевых выражениях - это разворачиваемое значение, которое теперь доступно для использования в коде, который следует за оператором (поскольку мы знаем, что будущий код может [11152] выполнять только [11152], если необязательный имеет значение ). Это отлично подходит для устранения

    «пирамид смерти»

    , созданных вложением нескольких операторов if. [11212] [11213] Например: [11213]
    [11214] Охранники также поддерживают те же аккуратные трюки, которые поддерживаются оператором if, такие как разворачивание нескольких опций в одно и то же время и использование предложения

    . [11214] ] [11215] Если вы используете оператор if или guard полностью зависит от того, требует ли какой-либо будущий код [11153] [11153] необязательный, чтобы содержать значение. [11215] [11167] Nil Coalescing Operator [11167] [11216]

    Nil Coalescing Operator

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

    , где

    является необязательным типом, а

    - это тот же тип, что и

    (хотя обычно он не является необязательным). [11216] [11217] Это, по сути, позволяет вам сказать: «Если

    содержит значение, разверните его. Если это не произойдет, то вместо этого верните

    ". Например, вы можете использовать его следующим образом: [11217] [11218] Это определит константу

    типа

    , которая либо будет содержать значение

    , если она содержит значение, или

    в противном случае. [11218] [11219] Это просто сокращение для: [11219] [11168] Необязательная цепочка [11168] [11220] Вы можете использовать
      Необязательный цепочек
    , чтобы вызвать метод или получить доступ к свойству на необязательном. Это просто делается путем суффикса имени переменной с помощью

    при ее использовании. [11220] [11221] Например, скажем, у нас есть переменная

    , типа необязательного экземпляра

    . [11221] [11222] Если бы мы хотели вызвать метод на
  • , который ничего не возвращает, мы можем просто сделать: [11222] [11223] Если
  • содержит значение, этот метод будет призвал его. Если это не так, ничего плохого не произойдет - код просто продолжит выполнение. [11223] [11224] (Это похоже на посылку сообщений в
  • в Objective-C) [11224] [11225]. Поэтому это также можно использовать для установки свойств, а также методов вызова. Например: [11225] [11226] Опять же, ничего плохого здесь не произойдет, если
  • -
  • . Ваш код просто продолжит выполнение. [11226] [11227] Еще один опрятный трюк, который необязательная цепочка позволяет вам проверить, была ли успешная установка свойства или вызов метода. Вы можете сделать это, сравнив возвращаемое значение с
  • . [11227] [11228] (Это связано с тем, что необязательное значение вернет
  • , а не
  • на метод, который ничего не возвращает) [11228] [11229] Например: [11229] [ 1117] [11230] Однако при попытке доступа к свойствам или вызовам, возвращающим значение, все становится немного сложнее. Поскольку
  • является необязательным, все, что возвращается от него, также будет необязательным. Чтобы справиться с этим, вы можете либо разворачивать опции, которые возвращаются с использованием одного из вышеуказанных методов, либо самостоятельно распаковывать
  • , прежде чем обращаться к методам или вызовам, возвращающим значения. [11230] [11231] Кроме того, как следует из названия, вы можете «объединить» эти утверждения вместе. Это означает, что если
  • имеет необязательное свойство
  • , которое обладает свойством
  • , вы можете написать следующее: [11231] [11232] Опять же, поскольку
  • и
  • являются необязательными , значение, возвращаемое с
  • , всегда будет необязательным, независимо от того, является ли
  • необязательным. [11232] [11169]

    и

    [11169] [11233] Часто недоиспользуемая функция с опциями - это способность использовать функции

    и

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

    . [11233] [11234] Например, допустим, у вас есть необязательная строка: [11234] [11235] Применяя к нему функцию

    - мы можем использовать функцию

    , чтобы связать ее с другой строкой. [11235] [11236] Поскольку

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

    , мы можем использовать allow

    , если

    имеет значение. [11236] [11237] Например: [11237] [11238] Однако, если

    не имеет значения,

    вернется

    . Например: [11238] [11239]

    работает аналогично

    , за исключением того, что позволяет вам вернуть [11154] другой [11154] дополнительный из корпуса закрывания. Это означает, что вы можете ввести опцию в процесс, который требует нестандартного ввода, но может выводить необязательный сам. [11239] [11160]

    [11160] [11240] Система обработки ошибок Swift может быть безопасно использована с

    : [11240] [11241] Если

    выдает ошибку, ошибка будет безопасно обнаружена в блоке

    . [11241] [11242] Константа

    , которую вы видите в блоке

    , не была объявлена ​​нами - она ​​автоматически генерируется

    . [11242] [11243] Вы также можете объявить

    самостоятельно, у него есть то преимущество, что он может использовать его в полезном формате, например: [11243] [11244] Используя

    , этот способ - это правильный способ попробовать, поймать и обработать ошибки, возникающие из функций броска. [11244] [11245] Также есть

    , который поглощает ошибку: [11245] [11246] Но система обработки ошибок Swift также предоставляет способ «принудительно попробовать» с помощью

    : [11246] [11247] Концепции, описанные в этом сообщении, также применимы здесь: если ошибка будет сброшена, приложение будет аварийно. [11247] [11248] [11155] Вы должны использовать только

    , если вы можете доказать, что его результат никогда не потерпит неудачу в вашем контексте - и это очень редко. [11155] [11248] [11249] В большинстве случаев вы будете использовать полную систему Do-Try-Catch - и необязательную,

    , в редких случаях, когда обработка ошибки не важна. [11249]


    [11161] Ресурсы [11161] [11253] [11172]
      Документация Apple на быстрых опциях
    [11172] [11173]
      Когда использовать и когда не использовать неявно развернутые опциональные опции
    [11173] [11174]
      Узнайте, как отладить сбой приложения для iOS
    [11174] [11253]
  • 513
    ответ дан 28 revs, 12 users 63% 17 August 2018 в 13:06
    поделиться
    • 1
      Лично я хотел бы поблагодарить вас за то, что вы пытаетесь написать все это. Я чувствую, что это, безусловно, будет полезно для начинающих и экспертов, используя быстрый. – Pranav Wadhwa 6 June 2016 в 01:27
    • 2
      Я рад, что вы сочли это полезным. Этот ответ является вики-сообществом, поэтому это сотрудничество между многими людьми (7, пока)! – jtbandes 6 June 2016 в 04:44
    • 3
      Эта ошибка прерывается в моем случае. Какие-либо предложения? Код в stackoverflow.com/questions/50933681/… – py_ios_dev 19 June 2018 в 17:12

    У меня была эта ошибка, когда я пытался установить значения Outlets из метода подготовки к методу segue следующим образом:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? DestinationVC{
    
            if let item = sender as? DataItem{
                // This line pops up the error
                destination.nameLabel.text = item.name
            }
        }
    }
    

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

    Поэтому я решил это следующим образом:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? DestinationVC{
    
            if let item = sender as? DataItem{
                // Created this method in the destination Controller to update its outlets after it's being initialized and loaded
                destination.updateView(itemData:  item)
            }
        }
    }
    

    Destination Controller:

    // This variable to hold the data received to update the Label text after the VIEW DID LOAD
    var name = ""
    
    // Outlets
    @IBOutlet weak var nameLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Do any additional setup after loading the view.
        nameLabel.text = name
    }
    
    func updateView(itemDate: ObjectModel) {
        name = itemDate.name
    }
    

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

    3
    ответ дан Wissa 17 August 2018 в 13:06
    поделиться

    Во-первых, вы должны знать, что такое необязательное значение. Для детализации вы можете перейти на Swift Programming Launage

    .

    Во-вторых, вы должны знать, что необязательное значение имеет два состояния. Один - это полное значение, а другое - значение nil. Поэтому перед тем, как вы реализуете необязательное значение, вы должны проверить, в каком состоянии оно находится.

    Вы можете использовать if let ... или guard let ... else и т. Д.

    Другой способ, если вы 't хотите проверить его состояние перед вашим исполнением, вы также можете использовать var buildingName = buildingName ?? "buildingName".

    8
    ответ дан QiunCheng 17 August 2018 в 13:06
    поделиться

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

    Другой способ объявить необязательную переменную -

    var i : Optional<Int>

    И необязательный тип - это не что иное, как перечисление с двумя случаями, т. е.

     enum Optional<Wrapped> : ExpressibleByNilLiteral {
        case none 
        case some(Wrapped)
        .
        .
        .
    }
    

    Итак, чтобы назначить nil нашей переменной i. Мы можем сделать var i = Optional<Int>.none или присвоить значение, мы передадим некоторое значение var i = Optional<Int>.some(28)

    . Согласно swift, «nil» - это отсутствие значения. И создать экземпляр, инициализированный с помощью nil. Мы должны соответствовать протоколу с именем ExpressibleByNilLiteral и большим, если вы его догадались, только Optionals соответствуют ExpressibleByNilLiteral и соответствуют другим типам.

    ExpressibleByNilLiteral имеет единственный метод, называемый init(nilLiteral:), который инициализирует instace с nil. Обычно вы не вызываете этот метод, и в соответствии с быстрой документацией не рекомендуется называть этот инициализатор напрямую, когда компилятор вызывает его всякий раз, когда вы инициализируете необязательный тип с литералом nil.

    Даже мне приходится обертывать (нет каламбур) моя голова вокруг опций: D Happy Swfting All .

    8
    ответ дан Tharzeez 17 August 2018 в 13:06
    поделиться

    TL; DR answer

    С очень мало исключений это правило является золотым:

    Избегайте использования !

    Объявить переменную опциональную (?), а не неявно разворачиваемые опции (IUO) (!)

    Другими словами, скорее используйте: var nameOfDaughter: String?

    Вместо: var nameOfDaughter: String!

    Исключить необязательную переменную с помощью if let или guard let

    Либо разверните переменную, как это:

    if let nameOfDaughter = nameOfDaughter {
        print("My daughters name is: \(nameOfDaughter)")
    }
    

    Или вот так:

    guard let nameOfDaughter = nameOfDaughter else { return }
    print("My daughters name is: \(nameOfDaughter)")
    

    Этот ответ должен был быть кратким, для полного понимания прочитал принятый ответ

    44
    ответ дан 6 revs, 3 users 91% 17 August 2018 в 13:06
    поделиться

    Этот вопрос возникает ВСЕ ВРЕМЯ на SO. Это одна из первых вещей, с которой сталкиваются новые разработчики Swift.

    Фон:

    Swift использует концепцию «Опционы» для обработки значений, которые могут содержать значение, или нет. В других языках, таких как C, вы можете сохранить значение 0 в переменной, чтобы указать, что оно не содержит значения. Однако, что, если 0 является допустимым значением? Тогда вы можете использовать -1. Что, если -1 является допустимым значением? И так далее.

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

    Вы помещаете вопросительный знак после типа, когда вы объявить переменную для обозначения (введите x или no value).

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

    Необязательно необходимо «распаковать», чтобы получить значение внутри.

    «!» оператор - оператор «разворота силы». Он говорит: «Поверь мне, я знаю, что делаю. Я гарантирую, что когда этот код будет запущен, переменная не будет содержать нуль». Если вы ошибаетесь, вы рухнете.

    Если вы действительно не знаете, что делаете, избегайте «!». оператор разворачивания силы. Вероятно, это самый большой источник сбоев для начинающих программистов Swift.

    Как бороться с опциями:

    Существует множество других способов решения более безопасных опций. Вот некоторые (не исчерпывающий список)

    Вы можете использовать «необязательное связывание» или «если пусть» сказать «если это необязательное значение содержит значение, сохраните это значение в новой, необязательной переменной. Если опция не содержит значения, пропустите тело этого оператора if.

    Ниже приведен пример необязательной привязки с нашим foo необязательным:

    if let newFoo = foo //If let is called optional binding. {
      print("foo is not nil")
    } else {
      print("foo is nil")
    }
    

    Примечание. что переменная, которую вы определяете при использовании дополнительного biding, существует (только «в области видимости») в теле оператора if.

    В качестве альтернативы вы можете использовать инструкцию охраны, которая позволяет вам выйти из вашей функции если переменная равна nil:

    func aFunc(foo: Int?) {
      guard let newFoo = input else { return }
      //For the rest of the function newFoo is a non-optional var
    }
    

    В Swift 2. Guard добавлены утверждения Guard. Guard позволяет сохранить «золотой путь» через ваш код и избегать постоянно растущих уровней вложенных ifs, которые иногда возникают из используя необязательную привязку «if let».

    Существует также конструкция, называемая «оператор объединения ниль». Он принимает форму «optional_var ?? replacement_val». Он возвращает необязательную переменную с тем же типом, что и данные, содержащиеся в необязательном. Если опция содержит nil, она возвращает значение выражения после "??" символ.

    Таким образом, вы можете использовать такой код:

    let newFoo = foo ?? "nil" // "??" is the nil coalescing operator
    print("foo = \(newFoo)")
    

    Вы также можете использовать функцию try / catch или guard error, но, как правило, один из других методов выше - более чистый.

    РЕДАКТИРОВАТЬ:

    Еще один, немного более тонкий ключ с опциями - это «неявно разворачиваемые опционы». Когда мы объявляем foo, мы можем сказать:

    var foo: String!
    

    In в этом случае foo по-прежнему является необязательным, но вам не нужно разворачивать его, чтобы ссылаться на него. Это означает, что каждый раз, когда вы пытаетесь ссылаться на foo, вы вылетаете, если его нет.

    Итак, этот код:

    var foo: String!
    
    
    let upperFoo = foo.capitalizedString
    

    Сбой при ссылке на свойство capizedString foo, даже если мы не разворачиваем силу foo. Печать выглядит отлично, но это не так.

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

    Нижняя строка. Когда вы впервые изучаете Swift, притворитесь, что символ «!» не является частью язык. Вероятно, вы получите int o проблема.

    34
    ответ дан Duncan C 17 August 2018 в 13:06
    поделиться
    • 1
      Вы должны подумать о том, чтобы сделать это общедоступной вики. – vacawama 28 February 2016 в 15:42
    • 2
      Отредактируйте свой ответ, и под полем редактирования справа находится флажок community wiki . Вы больше не будете отвечать за ответ, но я знаю, что это не вопиющая репутация. – vacawama 28 February 2016 в 15:49
    • 3
    • 4
      Учитывая, что этот вопрос задан в миллион раз на сайте, если я собираюсь потратить время, чтобы опубликовать вопрос с автоответчиком в качестве канонического ответа на вопрос, я надеюсь, что ответ будет намного более полным, чем это. В предложениях guard ничего нет. Нет ничего о том, как использовать if var, который так же корректен, как и if let. Нет ничего о where предложениях, которые, как мне кажется, стоит упомянуть, когда мы говорим о привязке if let (во многих случаях он удаляет целый слой вложенности). Нет ничего о дополнительной цепочке. – nhgrif 28 February 2016 в 23:00
    • 5
      И когда вы указываете неявно развернутые опции, вы даже не упоминаете, что вы можете использовать все вышеупомянутые необязательные трюки, чтобы безопасно разворачивать неявно развернутые опции. Мы также не рассматриваем разворачивание нескольких опций в том же предложении. – nhgrif 28 February 2016 в 23:01

    фатальная ошибка: неожиданно найден nil при распаковке необязательного значения

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

    Например,

    var tempVar: String?
    print(tempVar!)
    

    tempVar не инициализирован, поэтому приложение отключается в этом случае, поэтому вам нужно использовать

    print(tempVar ?? "") 
    

    . См. Необязательный цепочка для более подробной информации

    -3
    ответ дан 2 revs, 2 users 83% 17 August 2018 в 13:06
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: