programing

빠른 상수:구조자 열거형

starjava 2023. 8. 10. 18:08
반응형

빠른 상수:구조자 열거형

둘 중 어느 것이 상수를 정의하는 것이 더 나은지 잘 모르겠습니다.구조체 또는 열거형입니다.구조물은 사용할 때마다 복사됩니까? 있는 때, 는저.static let상수는 제 생각에 그것이 항상 복사된다는 것은 말이 되지 않습니다.하지만 복사가 안 된다면 제가 뭘 가져가도 상관없나요?

구조자의 선택은 어떤 이점을 열거합니까?

프란체스코는 구조를 사용하라고 말합니다.

Ray Wenderlich는 열거형을 사용한다고 말합니다.하지만 저는 정당성이 부족합니다.

구조체와 열거형이 모두 작동합니다.예를 들어, 둘 다

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()

임 (의useless) 의 (을 만듭니다.PhysicalConstants그러나 대소문자가 없는 열거의 경우 컴파일에 실패합니다.

let foo = PhysicalConstants()
// error: 'PhysicalConstants' cannot be constructed because it has no accessible initializers

다음은 간단한 답변입니다.상수가 고유해야 합니까?그런 다음 이 작업을 수행하는 열거형을 사용합니다.

동일한 값을 포함하기 위해 여러 개의 다른 상수를 사용하시겠습니까(명확성에 유용한 경우가 많음)?그런 다음 이것을 허용하는 구조를 사용합니다.

둘 사이의 한 가지 차이점은 열거형이 할 수 없는 경우 구조를 인스턴스화할 수 있다는 것입니다.따라서 상수만 사용하면 되는 대부분의 시나리오에서는 혼동을 방지하기 위해 열거형을 사용하는 것이 가장 좋습니다.

예:

struct Constants {
    static let someValue = "someValue"
}

let _ = Constants()

위의 코드는 여전히 유효합니다.

열거형을 사용하는 경우:

enum Constants {
    static let someValue = "someValue"
}

let _ = Constants() // error

위의 코드는 유효하지 않으므로 혼동을 방지합니다.

Xcode 7.3.1 및 Swift 2.2 사용

Wenderlich 더 낫다는 잘하지만, Martin R과 Ray Wenderlich를 하는 한 .struct의 카드enums.

스위치 문

먼저 Struct 버전부터 살펴보겠습니다.

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")
}

이제는 함수이므로 대/소문자 문장에 괄호가 필요합니다.

단점은 이제 우리가 그것을 함수로 만들었기 때문에, 그것은 그것이 호출될 때마다 실행된다는 것입니다.그래서 만약 그것이 단지 단순한 원시적인 유형이라면.String또는Int이것은 그렇게 나쁘지 않습니다.이것은 본질적으로 계산된 속성입니다.계산해야 하는 상수이고 한 번만 계산하려면 다른 속성으로 계산하고 이미 계산된 값을 마감에 반환하는 것을 고려하십시오.

기본 이니셜라이저를 개인 이니셜라이저로 재정의할 수도 있습니다. 그러면 대소문자가 없는 열거형과 동일한 종류의 컴파일 시간 오류가 발생합니다.

struct StaticVars {
    static let someString = "someString"
    private init() {}
}

그러나 이것을 사용하면 구조체의 선언을 자체 파일에 넣고 싶을 것입니다. 예를 들어 ViewController 클래스와 동일한 파일에 선언한 경우에도 해당 클래스의 파일은 여전히 유용하지 않은 인스턴스를 인스턴스화할 수 있기 때문입니다.StaticVars하지만 수업 파일 밖에서는 의도한 대로 작동합니다.하지만 당신이 결정할 일입니다.

Combine 프레임워크에서 Apple은 네임스페이스에 대한 열거형을 선호했습니다.

enum Publishers

게시자 역할을 하는 형식의 네임스페이스입니다.

enum Subscribers

구독자 역할을 하는 형식의 네임스페이스입니다.

enum Subscriptions

구독과 관련된 기호의 네임스페이스입니다.

언급URL : https://stackoverflow.com/questions/38585344/swift-constants-struct-or-enum

반응형