일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- IOS
- Git
- optional
- Class
- String
- tuist
- Protocol
- Foundation
- property
- type
- 코딩테스트
- interpace
- delegate
- url
- extension
- Unicode
- Xcode
- Method
- enum
- Terminal
- instance
- init
- Swift
- 이니셜라이저
- initializer
- initalizer
- struct
- 디자인패턴
- 스위프트
- UIKit
- Today
- Total
목록type (6)
아리의 iOS 탐구생활
Protocol Extension extension은 타입을 확장한다. 프로토콜 역시 타입이기 때문에 extension을 활용하여 확장할 수 있다. 프로토콜에는 정의만 한다고 하였는데 extension을 통해 구현을 추가한다는 것이 조금 어색할 수도 있다. 정리하자면 문법적으로는 프로토콜의 구현을 추가하지만 실제로는 프로토콜을 채용한 타입의 구현이 추가된다고 보면 된다. 코드의 중복을 줄이면서 프로토콜을 확장시킬 수 있다는 장점이 있다. 예제를 통해 이해해보자. protocol SayText { var text: String { get set } func say() } extension SayText { func say() { print(text) } } struct A: SayText { var tex..
Protocol Types 프로토콜은 first-class Citizen이다. 즉 독립적인 타입이다. 변수나 상수를 사용할때 자료형으로 사용하거나 파라미터의 자료형으로 사용할 수 있다. 반환타입으로 선언하는 것도 가능하다. protocol TypeA { func say() } class A: TypeA { let text: String = "난 A야!" func say() { print(text) } } let a = A() let t: TypeA = A() // 타입을 프로토콜로 선언하여도 에러가 없다. 확인해보면 프로토콜 타입으로 클래스 인스턴스를 생성하여도 에러가 없다. 왜냐하면 클래스 A는 프로토콜 TypeA를 채택하고 있기 때문이다. 이것은 슈퍼클래스 타입을 저장하는 업캐스팅과 유사하다. 업캐스..
Initializer Requirements 🔍 구조체와 클래스에서 생성자 구현의 차이 구조체는 Memberwise Initializers를 통해 프로토콜 요구사항을 충족시킬 수 있다. 직접 이니셜라이저를 구현해줘도 상관없다. 클래스는 상속을 고려해야하고 모든 서브클래스에서 프로토콜의 요구사항을 충족시켜야 한다. 그래서 클래스에서는 required initializer로 선언해야 한다. protocol Test { var name: String { get } init(name: String) } //struct A: Test { // var name: String // Memberwise Initializers를 통해 프로토콜 요구를 충족시킨다. //} struct A: Test { var name: S..
Method Requirements 👉🏻 프로토콜에서의 메소드 정의하기 protocol Protocols { func A(param: Int) -> Int static func B(param: String) -> String mutating func C(param: Double) -> Double // 값타입 전용은 아니다. 참조타입에서도 채택가능하다. } 프로토콜은 메서드 이름, 파라미터 이름과 타입, 리턴 타입만 정의한다. 채택하여 메서드를 구현할때 구현부는 자유롭게 작성할 수 있다. protocol Talk { func say() } class A: Talk { func say() { print("난 클래스 A라고 해.") } } 만약 구조체안에 메서드가 프로퍼티의 값을 바꾸려한다면 mutating..
Property Requirments 프로토콜에서는 프로퍼티가 저장프로퍼티인지 연산프로퍼티인지 명시하지 않고, 이름과 타입 그리고 gettable, settable한지 명시한다. 프로퍼티는 항상 var로 선언해야 한다. 프로토콜에서의 var 키워드는 가변성과는 아무런 관계가 없다. 대신 선언하는 멤버가 프로퍼티라는 것을 나타낸다. protocol Protocols { var name: String { get set } static var age: Int { get set } } get과 set이 모두 포함되어있다면 형식에서 읽기와 쓰기가 가능한 프로퍼티로 구현해야하고, get만 포함되어있는 경우에는 읽기 가능하도록 구현하면 된다. 타입 프로퍼티로 선언할때는 var 키워드 앞에 static을 추가해주면 된..
프로토콜(Protocol)은 최소한으로 가져야할 속성이나 메서드를 정의해줄 수 있다. 구현은 하지않고 정의만 하는게 특징이다. 프로토콜을 적용하면 프로토콜에서 정의한 속성과 메서드를 모두 구현해야 한다. 하나의 타입으로 사용되기 때문에 아래와 같이 타입 사용이 허용되는 모든 곳에 프로토콜을 사용할 수 있다. 함수, 메소드, 이니셜라이저의 파라미터 타입 혹은 리턴 타입 상수, 변수, 프로퍼티의 타입 배열, 딕셔너리의 원소타입 🔍 기본형태 protocol name { // 프로토콜 정의 } 구조체, 클래스, 열거형 등에서 프로토콜을 채택하려면 타입 이름 뒤에 콜론”:”을 붙여준 후 채택할 프로토콜 이름을 쉼표”,”로 구분하여 명시해준다. SubClass의 경우 SuperClass를 가장 앞에 명시한다. st..