Все это связано с инициализацией класса.
возьмите Outlets, например, они принудительно развернуты, потому что мы знаем, что они будут содержать значение после инициализации из XIB или раскадровки, но они не будут установлены до классаинициализация.
Принудительно распаковываемые необязательные выходы, чтобы сообщить компилятору, что я беру на себя ответственность убедиться, что эта переменная будет установлена перед вызовом.
в вашем примереЯ не думаю, что имеет смысл написать:
let aString: String! = "this is a test string"
Это должно быть так, как вы написали:
let aString: String = "this is a test string"
Имеет смысл иметь:
var aString: String!
означает, что вы станете владельцем этой переменной инициализации (т.е. убедитесь, что она не равна нулю)