Sobes.tech
Junior

რა მოხდება, თუ Swift-ის ოპციონალებს გავაუქმებთ?

sobes.tech AI

პასუხი AI-სგან

Бу кодның курмандыгы айтарлыктай төмөндөйт эле. Көптөгөн операциялар потенциалдуу коркунучтуу болуп калат, анткени компилятор маанинин бар-жогун кепилдей албайт.

  1. Optional Chaining (?) жана Forced Unwrapping (!) алып салуу. Опционалдар менен иштөө синтаксиси жараксыз болуп калат.
  2. nil текшерүүлөрдүн зарылдыгы. Өнүктүрүүчүлөр ар бир операция үчүн өз алдынча if шарттарын жазыш керек болот, бул boilerplate коддун санын жана анын татаалдыгын көбөйтөт.
  3. Кырсыктар коркунучу. Маанинин бар-жогун кепилдебегендиктен, nilге кайрылыу аракеттери ишке ашканда ката кетет (runtime error).
  4. Асинхрондуулук үчүн көркөм чечимдердин жоктугу. Асимхрондук операциялардын натыйжаларын иштетүү, алар ийгиликсиз аяктоосу мүмкүн (nil кайтаруу), оорлошот.
  5. Objective-C API менен иштөө татаалдуулугу. Көптөгөн Objective-C ыкмалары nil кайтарат, алсыздыкты көрсөтүү үчүн же маанинин жоктугун билдирет. Интеграция коопсуздугун төмөндөтөт.

Мисал коду алдын жана кийин (гипотетикалык):

Мурун:

var optionalString: String? = "Hello"
let length = optionalString?.count // Optional chaining

Кийин (гипотетикалык):

var nonOptionalString: String // Эми бардык өзгөрмөлөрдүн мааниси болушу керек, же ачык текшерүү керек
var potentiallyNilStringFromSomewhere: String

// Optional chaining ордуна мындай жазылмак:
if someFunctionCouldReturnNil() {
    // Ката иштетүү
} else {
    potentiallyNilStringFromSomewhere = ... // Маани берүү
    let length = potentiallyNilStringFromSomewhere.count // Потенциалдуу кырсык, эгер мааниси чын эле `nil` болсо
}

// же мындай, эгер `nil` дагы эле тилде бар болсо, бирок компилятордун колдоосу жок болсо:
if potentiallyNilStringFromSomewhere != nil {
    let length = potentiallyNilStringFromSomewhere!.count // Коркунучтуу мажбурлап алуу
} else {
    // `nil` иштетүү
}

Мындайча айтканда, код ишке ашканда каталар көбөйөт, окуу кыйын жана кармоо татаал болот. Опционалдар Swiftтин негизги механизмдеринин бири болуп саналат, типтик коопсуздукту камсыз кылуу жана Null Pointer Exception-дер менен күрөшүү үчүн.