Добавление в?или же !делает мой код грязным и заставляет меня все менять после него.
Что ж, неаккуратно ли это, субъективно.Swift разработан таким образом, чтобы вы тщательно продумали каждую опциональную упаковку.Делая это, вы можете избежать многих из этих «неожиданно найденных nil при развертывании необязательного значения» ошибок.
Методы и свойства возвращают nil
по причине.Обычно причина в том, что произошла ошибка, что-то не удалось сделать, или для свойства не существует действительного значения.Вам следует подумать об этих проблемах: «Что должен делать мой метод, если этот метод возвращает nil
?»
Если вы хотите сделать что-то еще, когда значение равно nil
(т. Е. Нулевое значение не является фатальнымк вашей логике), используйте оператор if let
.Например,
if let scaledCIImage = scaledImage?.ciImage {
// deal with the scaledCIImage
} else {
// do something else to remedy. The method can still continue running
}
Если ваш метод не может продолжить работу, если значение равно nil, вы можете написать защитное утверждение:
guard let scaledCIImage = scaledImage?.ciImage else {
// you need to return some value or call "fatalError()" here
}
Если вы абсолютно уверены, что значение можетне обнуляйте, принудительно разверните его:
let scaledCIImage = scaledImage!.ciImage!
Для второй ошибки вы можете исправить это следующим образом:
// with force unwrapping
let filter = CIFilter(name: "CIAffineTile", withInputParameters:[kCIInputImageKey:scaledCIImage])!.outputImage!
// if let
if let filter = CIFilter(name: "CIAffineTile", withInputParameters:[kCIInputImageKey:scaledCIImage])?.outputImage {
// ...
}
// guard let
guard let filter = CIFilter(name: "CIAffineTile", withInputParameters:[kCIInputImageKey:scaledCIImage])?.outputImage else {
// ...
}
Вы можете объединить все это в большую if let
или guard let
утверждение, подобное тому, которое показал rmaddy.