What is '@frozen' in Swift?

ios dev·2022년 3월 19일
2

Swift

목록 보기
2/3
post-thumbnail

@frozen is Declaration Attributes

Declaration Attributes 중 하나인 @frozen을 구조체(struct) 또는 열거형(enum) Declaration에 적용하면 타입 변경을 제한할 수 있다.

이 attribute는 library evolution mode에서 컴파일할 때만 허용된다.

Note.
컴파일러가 library evolution mode에 있지 않으면 모든 구조체와 열거형은 암시적으로 frozen되고 이 속성은 무시된다.

what is Declaration?
what is library evolution mode?


Example: @frozen이 없는 enum

컴파일러가 library evolution mode에 있고 enum에 @frozen을 적용하지 않은 경우, switch문에 모든 case를 구현했음에도 아래와 같은 에러가 발생할 수 있다.

/// enum
enum FontSize {
	case light, regular, medium
}

/// configureFontSize
func configureFontSize(_ fontSize: FontSize) {
	switch fontSize {
		case .light: break
		case .regular: break
		case .medium: break
	}
}

⚠️ Switch covers known cases, but FontSize may have additional unknown values, possibly added in future versions

Handle unknown values using “@unknown default

Why @unknown default?

@unknown default를 사용하게 되면 새로운 case에 대한 컴파일러 경고가 생성되기 때문에 취해야 할 조치를 결정할 수 있다. 반면에 default를 사용하게 되면 새로운 case를 삼켜버리기 때문에 조치를 결정할 수 없다.


Example: @frozen을 적용한 enum

enum에 @frozen을 적용하게 되면 enum의 타입은 고정되고 위와 같은 에러는 발생하지 않는다.

/// enum
@frozen
enum FontSize {
	case light, regular, medium
}

func configureFontSize(_ fontSize: FontSize) {
	switch fontSize {
		case .light: break
		case .regular: break
		case .medium: break
	}
}

End.

Library evolution support은 기본적으로 꺼져있고, 컴파일러가 library evolution mode에 있지 않으면 암시적으로 frozen이 되기 때문에 크게 신경쓰지 않아도 될 것 같다는 생각이 든다.






cf.
https://docs.swift.org/swift-book/ReferenceManual/Attributes.html
https://useyourloaf.com/blog/swift-5-frozen-enums/

0개의 댓글