enum을 지금까지는 그냥 정해진 제한 범위내의 값을 사용하기 쉽게 모아놓은 타입이라 생각했는데, 메모리 공간을 공부하다 보니 stack에 저장되는지 heap에 저장되는지 매우 중요했다. reference count 때문인데, 이것이 적을수록 좋기 때문에, 가급적 string보다 enum 사용이 좋은 경우가 있더라.
그래서 enum의 특징을 찾았는데, 해석해보면.
- They are stored in stack
- They have no inheritance
- They don’t require explicit initializer
- They can conform to protocols
- It can have extensions
- It even can have methods and computed properties(not stored!)
- And it can be used with generic types
enum은 struct와 같이 value-type입니다.
- 스택에 저장된다.
- 상속이 없다.
- 명시적인 이니셜라이저가 필요 없다.
- protocol을 따를수 있다!
- extension을 가질수 있다!
- methods와 computed properties를 가질 수 있다!
- generic type과 함께 쓰일 수 있다?
7번은 좀 생소해서 사례를 가져왔다.
여기까지가 기본적인 enum에 대한 정보들이다.
이제는 약간 심화 내용인데, enum이 value-type이다 보니, enum안에 recursion은 사용하면 안된다함.
stack에 저장되려면 정확한 사이즈를 알아야되는데, 리컬젼은 모르니까...
하지만 indirect case는 힙 메모리를 포인트 하도록 하여 위처럼 사용이 가능하다함.
indirect enum 또는 indirect case를 통해 heap에 enum의 데이터가 저장되도록 하고, point하여 값을 참조하는 방식을 사용할 수 있다.
indirect enum LinkedListItem<T> {
case endPoint(value: T)
case linkNode(value: T, next: LinkedListItem)
}
let third = LinkedListItem.endPoint(value: "Third")
let second = LinkedListItem.linkNode(value: "Second", next: third)
let first = LinkedListItem.linkNode(value: "First", next: second)
var currentNode = first
listLoop: while true {
switch currentNode {
case .endPoint(let value):
print(value)
break listLoop
case .linkNode(let value, let next):
print(value)
currentNode = next
}
}
출처.
https://jusung.gitbook.io/the-swift-language-guide/language-guide/08-enumerations
https://medium.com/swlh/three-ways-to-use-enums-in-swift-21c51517162e
https://www.hackingwithswift.com/example-code/language/what-are-indirect-enums
'Advanced Swift' 카테고리의 다른 글
swift - 상속 또는 참조(reference)의 사용없이 polymorphism(다형성)을 지향 방법 (0) | 2022.12.20 |
---|---|
swift - method dispatch : 메소드 디스패치 (0) | 2022.12.20 |
swift string은 Stack, Heap 둘중 어디에 저장될까? (0) | 2022.12.19 |