Sobes.tech
Junior — Middle

Жабықты беру немесе жасау кезінде, ол көшіріледі ме немесе сілтеме бойынша беріле ме?

sobes.tech AI

AI-дан жауап

iOS (Swift/Objective-C) жүйесінде жабысқақтар (closures) сілтеме бойынша беріледі, ал көшірілмейді. Сонымен қатар, жабысқақ объектісі сілтеме типі болып табылады.

Алайда, сыртқы контексттен айнымалыларды ұстағанда, жабысқақтар осы мәндердің көшірмелерін жасай алады (мысалы, struct типіндегі мәндер үшін), немесе оларға сілтеме бойынша ұстауы мүмкін (егер олар класстар болса).

Swift-те мысал:

var x = 10
let closure = { print(x) } // жабысқақ x-ті мән бойынша ұстады (көшіреді)
x = 20
closure() // 10 шығарады, себебі x көшірмемен ұсталынды

Жабысқақты функцияға беру немесе оны айнымалыға сақтау кезінде, оның барлық денесін көшіру емес, сілтеме беріледі.

Осылайша, жабысқақтар сілтеме бойынша беріледі, бірақ ұсталынған айнымалылар олардың типі мен контекстіне байланысты көшірілуі немесе сілтеме бойынша ұсталуы мүмкін.