스위프트 상수 : Struct 또는 Enum
둘 중 어느 것이 상수를 정의하는 것이 더 나은지 잘 모르겠습니다. 열거 또는 열거 형. 염증은 사용할 때마다 복사? static let
상수 가있는 구조체에 대해 생각할 때 제 생각에는 항상 복사된다는 [해석] 의미가 없습니다. 그러나 그것이 복제되지 않는 것이 중요하지 않습니까?
어떤 이점 또는 열거 형을 선택하면 어떤 이점이 있습니까?
Ray Wunderlich는 Enum을 사용합니다. 그러나 나는 그것이 부족합니다.
모든 열거 작동합니다. 예를 들어, 둘 다
struct PhysicalConstants {
static let speedOfLight = 299_792_458
// ...
}
과
enum PhysicalConstants {
static let speedOfLight = 299_792_458
// ...
}
작동하고 정적 속성을 정의합니다 PhysicalConstants.speedOfLight
.
Re : 염증은 사용할 때마다 치료?
struct
그리고 둘 다 enum
값 유형 나열 형에도 적용됩니다. 하지만 여기서는 값을 전혀 만들 필요가 없기 때문에 관련 이 없습니다. 정적 속성 ( 유형 속성 이라고도 함 )은 해당 유형의 인스턴스가 아니라 유형의 자체 속성입니다.
Re : 열거 또는 열거 형을 선택하면 어떤 이점이 있습니까?
링크 된 문서 에서 언급했듯이 :
대소 문자가없는 열거를 사용하는 이점은 실수로 인스턴스화 할 수없고 순수 네임 스페이스로 작동한다는 것입니다.
따라서 구조의 경우
let foo = PhysicalConstants()
유형의 (쓸모없는) 값을 생성 PhysicalConstants
하지만 대소 문자가없는 열거의 경우 실패합니다.
let foo = PhysicalConstants()
// error: 'PhysicalConstants' cannot be constructed because it has no accessible initializers
짧은 대답은 다음과 가변합니다. 상수가 고유해야합니까? 그런 다음이를 적용하는 열거 형을 사용합니다.
동일한 값을 포함하기 위해 여러 가지 상수를 사용하고 싶으십니까 (종종 명확성을 위해 유용함)? 그런 다음이를 허용하는 모든 것을 사용합니다.
Xcode 7.3.1 및 Swift 2.2 사용
Martin R에 동의하고 Ray Wenderlich 스타일 가이드는 열거 형 네임 스페이스이기 때문에 거의 모든 사용 사례에서 더 좋다는 점을 지적하지만, struct
트럼프를 사용하는 곳이 한 곳 enums
있습니다.
스위치 문
모든 버전부터 시작하겠습니다.
struct StaticVars {
static let someString = "someString"
}
switch "someString" {
case StaticVars.someString: print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}
를 사용하면 Matched StaticVars.someString
.
이제 (키워드 만 변경하여 대소 문자를 구별 열거 버전을 고려할 수 struct
에를 enum
)
enum StaticVars {
static let someString = "someString"
}
switch "someString" {
case StaticVars.someString: print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}
case StaticVars.someString:
줄 의 스위치 문에서 시간 오류가 발생하는 것을 알 수 있습니다. 오류는 Enum case 'someString' not found in type 'String'
입니다.
정적 속성을 대신 형식을 반환하는 클로저로 변환하는 의사 해결 방법이 있습니다.
따라서 다음과 같이 변경합니다.
enum StaticVars {
static let someString = { return "someString" }
}
switch "someString" {
case StaticVars.someString(): print("Matched StaticVars.someString")
default: print("Didn't match StaticVars.someString")
}
이제는 함수이므로 case 문에 괄호가 필요합니다.
단점은 이제 함수로 만들었으므로 호출 될 때마다 실행된다는 것입니다. 따라서 String
또는 과 같은 단순한 기본 유형이라면 Int
그렇게 나쁘지 않습니다. 본질적으로 계산 된 속성입니다. 계산해야하는 상수이고 한 번만 계산하려는 경우 다른 속성으로 계산하고 이미 계산 된 값을 클로저에 반환하는 것을 고려하십시오.
기본 이니셜 라이저를 개인용으로 재정의 할 수도 있습니다. 그러면 대 / 소문자가없는 열거 형과 동일한 종류의 컴파일 타임 오류를 얻을 수 있습니다.
struct StaticVars {
static let someString = "someString"
private init() {}
}
그러나 이것으로 구조체의 선언을 자체 파일에 넣고 싶을 것입니다. 왜냐하면 뷰 컨트롤러 클래스와 같은 파일에서 선언 한 경우 해당 클래스의 파일은 여전히 실수로 쓸모없는 것을 인스턴스화 할 수 있기 때문입니다. 의 인스턴스 StaticVars
이지만 클래스 파일 외부에서는 의도 한대로 작동합니다. 그러나 그것은 당신의 부름입니다.
참고 URL : https://stackoverflow.com/questions/38585344/swift-constants-struct-or-enum
'ProgramingTip' 카테고리의 다른 글
JavaScript에서 (0) | 2020.11.11 |
---|---|
ng-click으로 $ event를 자동으로 전달 하시겠습니까? (0) | 2020.11.11 |
JavaScript 및 jQuery, 크로스 브라우저를 사용하여 키 누르기 이벤트 (F1-F12) 처리 (0) | 2020.11.11 |
단일성을 사용하여 명명 된 말을 생성자에 어떻게하면? (0) | 2020.11.11 |
C ++ 0x와 C ++ 11의 차이점은 무엇입니까? (0) | 2020.11.11 |