반응형
안녕하십니까 공부하는 개발자 입니다.
오늘 포스팅은 어제와 이어 프로토콜입니다.
지금 듣는 강의가 프로토콜에서는 기본적으로 구현을 위주로 되어있기 때문에 설명장체가 정교하지 못한 것 같습니다.
⚙️Method
protocol에서 method를 선언할 때는 body부분은 작성하지 않습니다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
protocol Resettable{
func reset()
}
class Size: Resettable{
var width = 0.0
var height = 0.0
func reset(){
width = 0.0
height = 0.0
}
}
//protocol은 mutating메서드에따라 method를 구분한다.
protocol Resettable1{
mutating func reset()
}
//반드시 struct에서만 구현해야 하는 것은 아니다.
struct Size1: Resettable1{
var width = 0.0
var height = 0.0
//값형식에서 속성을 변경하려면 mutating메서드 사용
mutating func reset(){
width = 0.0
height = 0.0
}
}
class Size2: Resettable1{
var width = 0.0
var height = 0.0
// class에서는 mutating이 없어도 사용할 수 있다.
func reset(){
width = 0.0
height = 0.0
}
}
protocol Resettable2{
static func reset()
}
class Size3: Resettable2{
var width = 0.0
var height = 0.0
func reset(){
width = 0.0
height = 0.0
}
static func reset() {
//오버라이딩 불가능
//이 부분을 class로 선언한다면 overridng이 가능함과 동시에 protocol조건도 맞춤
}
}
|
cs |
⚙️Initializer
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
protocol Figure{
var name: String { get }
init(name: String)
}
//기본 init의 경우에는 memberwise initializer가 자동으로 재공됨
//물론 init를 따로 선언하는 것도 가능
struct Rectangle: Figure{
var name: String
}
protocol Figure1{
var name: String { get }
init(n: String)
}
struct Rectangle1: Figure1{
var name: String
init(n: String){
name = n
}
}
//class의 경우에는 상속을 고려해야하고 모든 subClass에서 protocol의 요구사항을 충족 시켜야 한다.
//그렇기 때문에 class에서는 생성자를 required를 사용하여 선언한다.
class Circle: Figure1{
var name: String
required init(n: String){
name = n
}
}
//예외사항
//final의 경우에는 더이상 상속이 되지 않음으로 required를 선언하지 않아도 된다.
final class Triangle: Figure1{
var name: String
init(n: String){
name = n
}
}
// 이 밑의 부분은 Figure1을 Circle이 protocol를 채용하기 때문에 중복이다
//class Oval: Circle, Figure1{
//
//}
class Oval: Circle{
var prop: Int
init(){
prop = 0
super.init(n: "Oval")
}
//convenience로 구현하여도 protocol요구사항에 맞출수 있다.
//다만 required도 같이 사용해야한다.
required convenience init(n: String){
self.init()
}
}
protocol GrayScale{
init(white: Double)
}
struct Color: GrayScale{
// init?(white: Double){
//Optional과 nonOptional타입을 같은 타입으로 판단하지않아 오류가 생긴다
// }
init!(white: Double){
}
}
protocol GrayScale1{
init?(white: Double)
}
struct Color1: GrayScale1{
//protocol이 init?로 선언되어 있기 때문에 optional과 nonOptional둘다 가능
init!(white: Double){
}
}
|
cs |
반응형
'Ios > Swift' 카테고리의 다른 글
[Swift] Generic 스위프트 제네릭 (0) | 2022.08.07 |
---|---|
[Swift] Memory 스위프트 메모리 관리 (0) | 2022.08.06 |
[Swift] Protocol_1 스위프트 프로토콜 (0) | 2022.08.04 |
[Swift] Extension 스위프트 형식의 확장 (0) | 2022.08.02 |
[Swift] Initializer_3 스위프트 생성자 3 (0) | 2022.08.01 |