기존의 클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가하는 기능
extension이 타입에 추가할 수 있는 기능은 다음과 같다 !
참고로 extension타입에는 새로운 기능을 추가할 수 있지만 기존에 존재하는 기능을 오버라이드 할 수는 없다.
extension Int {
var isEven: Bool {
return self % 2 == 0
}
var isOdd: Bool {
return self % 2 == 1
}
}
var number = 3
number.isOdd // true
number.isEven // false
extension String {
func convertToInt() -> Int? {
return Int(self)
}
}
var string = "0"
string.convertToInt() // "0" => 0
extension Int {
func multiply(by n: Int) -> Int {
return self * n
}
mutating func multiplySelf(by n: Int) {
self = self.multiply(by: n)
}
static func isIntTypeInstance(_ instance: Any) -> Bool {
return instance is Int
}
}
var number: Int = 3
number.multiply(by: 2)
print(number) //3
number.multiplySelf(by: 3)
print(number) //9
number.multiplySelf(by: 3)
print(number) //27
print(Int.isIntTypeInstance(number)) //true
extension String {
init(intTypeNumber: Int) {
self = "\(intTypeNumber)"
}
init(doubleTypeNumber: Double) {
self = "\(doubleTypeNumber)"
}
}
let stringFromInt: String = String(intTypeNumber: 100)
let stringFromDouble: String = String(doubleTypeNumber: 100.0)
print(stringFromInt) //100
print(stringFromDouble) //100.0
class Person {
var name: String
init(name: String) {
self.name = name
}
}
extension Person {
convenience init() {
self.init(name: "Unknown")
}
}
let someOne: Person = Person()
print(someOne.name) //Unknown
extension String {
subscript(appedValue: String) -> String {
return self + appedValue
}
subscript(repeatCount: Int) -> String {
var str: String = ""
for _ in 0..<repeatCount {
str += self
}
return str
}
}
print("abc"["def"]) //abcdef
print("abc"[3]) //abcabcabc