Существует три способа объявления свойства в Swift:
var optStr: String?
var normStr: String = "normStr"
var exactStr: String!
Первый - это свойство с типом optional
, тип, который может содержать либо nil, либо String в нашем случае. Второй - это свойство, в котором всегда содержит строку. Он должен быть инициализирован в init или в объявлении.
Но как насчет третьего пути?
var exactStr: String!
Я сделал несколько экспериментов на игровой площадке, и оказалось, что функция, которая принимает type?
, может принимать как аргументы type
, type?
, так и type!
в качестве аргумента:
var optStr: String?
var normStr: String
var forcedStr: String!
func printStr(str: String?) {
println("str: \(str)")
}
printStr(optStr) //prints: "str: nil"
//printStr(normStr) //doesn't compile as not initialized
printStr(forcedStr) //prints: "str: nil"
optStr = "optStr"; normStr = "normStr"; forcedStr = "forcedStr"
printStr(optStr) //prints "str: optStr"
printStr(normStr) //prints "str: normStr"
printStr(forcedStr) //prints "str: forcedStr"
Так почему и когда я должен использовать type!
?
Обновление: это не дубликат Что означает восклицательный знак на языке Swift?. Я не спрашиваю об открытии переменной: я спрашиваю о declaring
свойстве с восклицательным знаком (type!
).