Самая новая версия 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)
{
(...)
}
wiki сообщества
. Если вы чувствуете, что это может быть улучшено, не стесняйтесьотредактируйте его
! [11175] [11156] Предыстория: что является дополнительным? [11156] [11176] В Swift[ 1126]
являетсяобщим типом
, который может содержать значение (любого вида) или вообще не имеет значения. [11176] [11177] Во многих других языках программирования особое значение «дозорного» часто используется для указания отсутствия) указывает на отсутствие объекта. Но это становится более сложным при работе с примитивными типами - следует ли использовать , чтобы указать отсутствие целого числа, или, возможно, или какое-либо другое целое число? Если какое-либо конкретное значение выбрано так, чтобы оно означало «no integer», это означает, что он больше не может считаться значением
.) [11182]
[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 или раскадровка свяжет выходы во время выполненияленивую переменную
или предоставить значение по умолчаниюпо умолчанию
для переменной - вы должны сделать это вместо использования неявно развернутого необязательного. [11198] [11199] Однако существует несколько сценариев, в которых неявно развернутые опции являются полезными
, и вы все еще можете использовать различные способы безопасного их развертывания, как указано ниже, но вы должны [11146] всегда [11146] используйте их с должной осторожностью. [11199]охранника
позволяет вам определить условие для успеха - и текущая область действия будет продолжать выполнение только в том случае, если это условие выполнено. Они определены с синтаксисомуправляет передающими операторами
, чтобы выйти из области текущего исполняемого кода). [11210] [11211] Если«пирамид смерти»
, созданных вложением нескольких операторов if. [11212] [11213] Например: [11213] [11214] Охранники также поддерживают те же аккуратные трюки, которые поддерживаются оператором if, такие как разворачивание нескольких опций в одно и то же время и использование предложенияNil Coalescing Operator
- отличная сокращенная версия тернарного условного оператора , в первую очередь предназначенная для преобразования опций в непараллельные. Он имеет синтаксиси
[11169] [11233] Часто недоиспользуемая функция с опциями - это способность использовать функции
и
. Они позволяют применять необязательные преобразования к необязательным переменным. Если параметр имеет значение, вы можете применить к нему заданное преобразование. Если он не имеет значения, он останется
. [11233] [11234] Например, допустим, у вас есть необязательная строка: [11234] [11235] Применяя к нему функцию - мы можем использовать функцию , чтобы связать ее с другой строкой. [11235] [11236] Поскольку принимает необязательный строковый аргумент, мы не можем напрямую вводить нашу необязательную строку. Однако, используя , мы можем использовать allow , если имеет значение. [11236] [11237] Например: [11237] не имеет значения, вернется . Например: [11238] работает аналогично , за исключением того, что позволяет вам вернуть [11154] другой [11154] дополнительный из корпуса закрывания. Это означает, что вы можете ввести опцию в процесс, который требует нестандартного ввода, но может выводить необязательный сам. [11239] [11160] [11160] [11240] Система обработки ошибок Swift может быть безопасно использована с выдает ошибку, ошибка будет безопасно обнаружена в блоке . [11241] [11242] Константа , которую вы видите в блоке , не была объявлена нами - она автоматически генерируется . [11242] [11243] Вы также можете объявить самостоятельно, у него есть то преимущество, что он может использовать его в полезном формате, например: [11243] , этот способ - это правильный способ попробовать, поймать и обработать ошибки, возникающие из функций броска. [11244] [11245] Также есть , который поглощает ошибку: [11245] : [11246] , если вы можете доказать, что его результат никогда не потерпит неудачу в вашем контексте - и это очень редко. [11155] [11248] [11249] В большинстве случаев вы будете использовать полную систему Do-Try-Catch - и необязательную, , в редких случаях, когда обработка ошибки не важна. [11249] Do-Try-Catch
: [11240] [11241] Если
[11161] Ресурсы [11161] [11253] [11172] Документация Apple на быстрых опциях
[11172] [11173] Когда использовать и когда не использовать неявно развернутые опциональные опции
[11173] [11174] Узнайте, как отладить сбой приложения для iOS
[11174] [11253]
У меня была эта ошибка, когда я пытался установить значения 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
}
Надеюсь, этот ответ поможет кому-то там с той же проблемой, что и я заметил, что заметный ответ - отличный ресурс для понимания опций и того, как они работают, но не затронул проблему напрямую.
Во-первых, вы должны знать, что такое необязательное значение. Для детализации вы можете перейти на Swift Programming Launage
.
Во-вторых, вы должны знать, что необязательное значение имеет два состояния. Один - это полное значение, а другое - значение nil. Поэтому перед тем, как вы реализуете необязательное значение, вы должны проверить, в каком состоянии оно находится.
Вы можете использовать if let ...
или guard let ... else
и т. Д.
Другой способ, если вы 't хотите проверить его состояние перед вашим исполнением, вы также можете использовать var buildingName = buildingName ?? "buildingName"
.
Так как в приведенных выше ответах четко объясняется, как безопасно играть с опциями. Я попробую объяснить, какие опции в действительности бывают быстрыми.
Другой способ объявить необязательную переменную -
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 .
С очень мало исключений это правило является золотым:
!
?
), а не неявно разворачиваемые опции (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)")
Этот ответ должен был быть кратким, для полного понимания прочитал принятый ответ
Этот вопрос возникает ВСЕ ВРЕМЯ на 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 проблема.
guard
ничего нет. Нет ничего о том, как использовать if var
, который так же корректен, как и if let
. Нет ничего о where
предложениях, которые, как мне кажется, стоит упомянуть, когда мы говорим о привязке if let
(во многих случаях он удаляет целый слой вложенности). Нет ничего о дополнительной цепочке.
– nhgrif
28 February 2016 в 23:00
фатальная ошибка: неожиданно найден nil при распаковке необязательного значения
В нем говорится, что вы используете переменную, значение которой не инициализировано или не задано нил.
Например,
var tempVar: String? print(tempVar!)
tempVar не инициализирован, поэтому приложение отключается в этом случае, поэтому вам нужно использовать
print(tempVar ?? "")
. См. Необязательный цепочка для более подробной информации