Extension у Swift-у је механизам који омогућава додавање нове функционалности постојећим типовима без измјене њиховог изворног кода. Проширења подржавају методе, израчунавана својства, иницијализаторе, субскрипте, угнијежђене типове и имплементацију протокола. Према Apple Documentation, 2026, проширења су кључни алат за организацију кода и поштовање Open/Closed принципа у Swift пројектима.
Главно
Extension у Swift-у је језичка конструкција која омогућава проширење постојећег типа (класе, структуре, enum-а, протокола) новим могућностима. То је аналог категоријама у Objective-C, али са већим могућностима.
Extension може додавати:
Према Аpple документацији, extension не може преиначити постојеће методе (dynamic dispatch) и не може додавати stored properties. Ова ограничења чувају интегритет оригиналног типа.
Extension се декларише кључном ријечју extension са навођењем типа који се проширује.
extension Double {
var km: Double { return self * 1000.0 }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1000.0 }
}
let distance = 5.0.km
print("5 km = \(distance) метара") // 5000.0
Можете проширити не само властите типове, већ и типове стандардне библиотеке Swift, Foundation, UIKit и других оквира. Ово чини extension моћним алатом за додавање доменски специфичне функционалности.
Extension омогућава додавање метода инстанце и типа било којем постојећем типу.
extension String {
func isValidEmail() -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
return self.range(of: emailRegex, options: .regularExpression) != nil
}
static func random(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyz0123456789"
return String((0..<length).map { _ in letters.randomElement()! })
}
}
let email = "user@example.com"
print(email.isValidEmail()) // true
let code = String.random(length: 8) // "a3f8k2m1"
Методе мутације проширују вриједносне типове (struct, enum) и могу мијењати self. За класе мутација није потребна. Extension може додати методе мутације чак и типовима стандардне библиотеке.
Extension може додати само израчунавана својства — stored properties су забрањени. Ово је логично: extension не управља меморијом оригиналног типа.
extension Date {
var isPast: Bool {
return self < Date()
}
var isToday: Bool {
return Calendar.current.isDateInToday(self)
}
}
let someDate = Date().addingTimeInterval(3600)
print(someDate.isPast) // false (један сат од сада је будућност)
Computed properties у extension подлијежу истим правилима као у основној имплементацији: могу се креирати својства { get } и { get set }. Swift не намеће ограничења на број extension за један тип. Можете декларисати колико год желите extension за један тип у различитим датотекама — то је стандардна пракса у великим пројектима.
Extension је пожељан начин имплементације протокола. Умјесто да загушујете основну декларацију типа, све методе протокола се измјештају у засебан extension.
struct User {
let id: Int
let name: String
let email: String
}
// Extension по протоколу — чисто раздвајање
extension User: Equatable {
static func == (lhs: User, rhs: User) -> Bool {
return lhs.id == rhs.id
}
}
extension User: Codable {
enum CodingKeys: String, CodingKey {
case id, name, email
}
}
Овај приступ раздваја одговорности: основна структура садржи само stored properties, extensions — имплементацију протокола. Swift чак дозвољава имплементацију протокола путем extension за типове које не контролишемо.
Extension није само језичка могућност, већ алат архитектуралне организације. Правилна употреба extensions чини код читљивим и лаким за одржавање.
// MARK: - Equatable за навигацијуprivate// MARK: - User + Displayable
extension User: Displayable {
var displayName: String {
return "\(name) (\(email))"
}
}
Према Swift API Design Guidelines, extensions побољшавају читљивост: програмер види структуру података у основној декларацији, а логику — у extensions. Ово је у складу са принципом раздвајања интерфејса (Interface Segregation).
Extension са where-ограничењима додаје методе само за одређене типове: extension Array where Element: Equatable { func isUnique() -> Bool }. Такав код је концизан и типно безбједан — метод isUnique се појављује само у низовима са Equatable елементима, елиминишући грешке у фази компилације и чинећи API чистијим, безбједнијим и разумљивијим за друге програмере.
Често постављана питања
Не, extension не може додати stored properties. Ово ограничење је фундаментално: extension не учествује у алокацији меморије за инстанцу типа. За stored properties користите основну декларацију типа.
Не, extension не може преиначити методе. Покушај декларисања метода са истим потписом као постојећи ће довести до грешке компилације. За преиначење користите насљеђивање класа.
Extension додаје функционалност без креирања новог типа. Subclassing креира хијерархију и подржава преиначење. Extension не захтијева приступ изворном коду и ради са свим типовима.
Да, extension може бити generic ако је проширени тип generic: extension Array where Element: Numeric. Такође се могу додати generic методе унутар extension са властитим параметрима типа.
Extension не утиче на перформансе — методе extension се компилирају као обичне методе. За протоколе са extension користи се static dispatch, што може бити брже од dynamic dispatch класа.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође