What is '@frozen' in Swift?
@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/
Author And Source
이 문제에 관하여(What is '@frozen' in Swift?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@haanwave/What-is-frozen-in-Swift저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)