Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- IOS
- actionSheet
- SWIFT
- avaliable
- On branch is up to date with ' '
- Git
- 내_삶
- 코드스니펫
- 제어전송문
- AnyObject
- copy-on-write
- MyLife
- unrecognized selector sent to class
- class
- Switch
- 연관값
- error해결
- 생명주기
- K디지털기초역량훈련
- 바이트디그리
- 글또9기
- uikit
- 다짐글
- 회고
- 글또
- struct
- 파스칼표기법
- 주간 달력
- ios 개발 강의
- weekly calendar
Archives
- Today
- Total
seong_hye, the developer
Swift) 문법정리 - 확장(Extension) 본문
확장(Extension)이란?
기존 클래스, 구조체, 열거형 타입에 새로운 Property, Method, Initializer 등을 추가하는 것으로,
원본 타입(소스 코드)에 접근하지 못하는 타입들도 확장해서 사용할 수 있음
extension이란 키워드를 사용하여 확장함
사용하는 이유?
원본 소스 코드에 대한 액세스 권한이없는 유형을 확장하는 기능이 포함 (소급-모델링 retroactive modeling)
예) Int, String, Double 등 애플이 미리 만들어 놓은 타입에 확장도 가능
[ Struct에선 self를 사용할 때 mutating 키워드 필요 ]
class Person {
var id = 0
var name = "이름"
var email = "1234@gmail.com"
func walk() {
print("사람이 걷는다.")
}
}
class Student: Person {
var studentId = 1
override func walk() {
print("학생이 걷는다.")
}
func study() {
print("학생이 공부한다.")
}
}
extension Student {
func play() {
print("학생이 논다.")
}
}
확장 가능한 멤버의 종류
클래스 / 구조체/ 열거형 타입에 확장이 가능
새로운 메서드(기능)을 추가할 수 있지만 (상속처럼) 본체에 대한 재정의는 불가
메서드 형태만 가능!! 저장속성은 정의할 수 없음!!
~> .(점)문법을 사용하여 접근
1) (타입) 계산 속성, (인스턴스) 계산 속성
속성을 확장하여 값을 좀 더 다양하게 활용 가능
// (타입)계산 속성
extension Double {
static var zero: Double { return 0.0 }
}
Double.zero
// (인스턴스)계산 속성
extension Double {
var km: Double { return self * 1_000.0 } // 인스턴스 자신에 1000 곱하기
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}
let oneInch = 25.4.mm
print("1인치는 \(oneInch) 미터") // 1인치는 0.0254 미터"
2) (타입) 메서드, (인스턴스) 메서드
// (타입)메서드
extension Int {
static func printNumbersFrom1to5() {
for i in 1...5 {
print(i)
}
}
}
Int.printNumbersFrom1to5()
//(인스턴스)메서드
extension String {
func printHelloRepetitions(of times: Int) {
for _ in 0..<times {
print("Hello \(self)!")
}
}
}
"Steve".printHelloRepetitions(of: 4)
3) 새로운 생성자
클래스
편의 생성자만 추가 가능
지정생성자 추가 불가 / 소멸자 추가 불가
(항상 본래의 클래스에서 정의해야 함)
extension UIColor {
convenience init(color: CGFloat) { // Float / Double
self.init(red: color/255, green: color/255, blue: color/255, alpha: 1)
}
}
구조체
원래 편의 생성자가 존재하지 않고, 상속과 관련이 없기 때문에
지정생성자의 형태로도 자유롭게 생성자 구현 가능
struct Rect { // 기본값 제공/생성자 구현안함 ===> 기본 생성자 / 멤버와이즈 생성자가 자동 제공 중
var origin = Point()
var size = Size()
}
extension Rect {
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
// (1) 본체의 멤버와이즈 생성자 호출 방식으로 구현 가능
self.init(origin: Point(x: originX, y: originY), size: size)
// (2) 직접 값을 설정하는 방식으로도 구현 가능
//self.origin = Point(x: originX, y: originY)
//self.size = size
}
}
4) 서브스크립트
extension Int {
subscript(num: Int) -> Int {
var decimalBase = 1
for _ in 0..<num {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
// 123456789[0] // 9
// 123456789[1] // 8
// 123456789[2] // 7
5) 새로운 중첩 타입 정의 및 사용
클래스, 구조체 및 열거형에 새 중첩 유형을 추가 가능
extension Int {
enum Kind { // 음수인지, 0인지, 양수인지
case negative, zero, positive
}
var kind: Kind { // 계산 속성으로 구현
switch self {
case 0: // 0인 경우
return Kind.zero
case let x where x > 0: // 0보다 큰경우
return Kind.positive
default: // 나머지 (0보다 작은 경우)
return Kind.negative
}
}
}
상속과 확장의 차이는?
상속 | 확장 |
수직적 개념 | 수평적 개념 |
성격이 비슷한 "타입을 새로"만들어, 데이터를 추가하고, 기능(메서드)을 변형시켜 사용하려는 것 | "현재 존재하는 타입"에 기능(메서드)을 추가하여 사용하려는 것 |
참고자료)
'IOS' 카테고리의 다른 글
URLSession (0) | 2022.10.27 |
---|---|
Swift) 문법 정리 - @attribute 키워드 (0) | 2022.10.22 |
Swift) 문법 정리 - COW(Copy-On-Write) (0) | 2022.08.02 |
Swift) 문법 정리 - 싱글톤(Singleton) 패턴 (0) | 2022.07.26 |
Swift) 문법 정리 - self vs Self (0) | 2022.07.19 |
Comments