Swift의 구조체에 대해 멤버 이니셜 라이저를 기본적으로 공개하려면 어떻게해야합니까?


164

구조체를 정의하는 신속한 프레임 워크가 있습니다.

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String
}

그러나 라이브러리를 가져 오는 다른 프로젝트에서 암시 적 멤버 현명한 이니셜 라이저를 사용할 수없는 것 같습니다. 오류는 'CollectionTO'에 액세스 할 수있는 초기자가 없기 때문에 초기화 할 수 없습니다. 즉, 기본 암시 적 멤버에 현명한 초 기자에게 public 키워드를 제공하지 않습니다.

var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases")

내 자신의 init 메소드를 다음과 같이 추가해야합니다.

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String

    public init(index: Order, title: String, description: String) {
        self.index = index;
        self.title = title;
        self.description = description;
    }

}

...하지만 다른 사람이 알고있는 다른 방법이 있다면 오히려 그렇지 않습니까?

답변:


268

매뉴얼 인용 :

"구조 유형의 기본 멤버 별 이니셜 라이저 구조의 저장된 특성 중 하나가 개인용 인 경우 구조 유형의 기본 멤버 별 이니셜 라이저는 개인용으로 간주됩니다. 그렇지 않으면 이니셜 라이저의 내부 액세스 레벨이 있습니다.

위의 기본 이니셜 라이저와 마찬가지로 다른 모듈에서 공용 구조 유형을 멤버 단위 이니셜 라이저로 초기화 할 수있게하려면 유형 정의의 일부로 공용 멤버 단위 이니셜 라이저를 직접 제공해야합니다. "

"Swift Programming Language" , "Access Control" 섹션 에서 발췌 .


288
글쎄, 그건 짜증나. :(
Dan Loewenherz

7
[ github.com/apple/swift-evolution/blob/master/proposals/… 말한다 :“Quoting Chris Lattner : Swift의 기본 멤버 별 이니셜 라이저 동작에는 최소한 다음과 같은 결함 (IMO)이 있습니다. 2) 액세스 제어 + 멤버 별 초기화 직접 구현해야합니다. " 따라서 특별한 이유없이 존재하는 것은 단지 결함 일 수 있습니다. 이에 대한 추가 참조를 찾을 수 없습니다.
Jano

8
@DanLoewenherz 네, 불편합니다. 근거는 다음과 같습니다.“공개 유형은 기본적으로 공개 구성원이 아닌 내부 구성원을 갖습니다. 형식 멤버를 공개하려면 명시 적으로 표시해야합니다. 이 요구 사항은 형식에 대한 공개 API가 게시를 선택한 것으로 보장하고 실수로 형식의 내부 작업을 공개 API로 표시하지 않도록합니다.” 발췌 : Apple Inc.“Swift Programming Language.” iBooks. itun.es/gb/jEUH0.l
bandejapaisa

18
컴파일러 지시문은 기본 동작을 재정의하고 공개하는 것이 좋습니다.
bandejapaisa

9
내부는 기본값 인 imo에 대한 끔찍한 선택입니다. 기본적으로 모듈을 외부에서 처음 참조 할 때 예기치 않은 문제가 발생할 수 있습니다. 어떤 것이 올바른 액세스 수준을 부여받지 못했을 때 즉시 알리고 공개 또는 내부 공개 여부를 결정할 수 있도록 모든 것을 비공개로 설정하지 않는 이유는 무엇입니까?
devios1

72

최소한 기본 멤버 별 이니셜 라이저를 가질 수는 없지만 다음 단계를 통해 신속하게 만들 수 있습니다.

  1. 구조체 대신 객체를 일시적으로 클래스로 만듭니다.
  2. 저장
  3. 클래스 이름을 마우스 오른쪽 단추로 클릭하고 리 팩터-> 멤버 별 초기화 프로그램 생성을 선택하십시오.
  4. 구조체로 다시 변경하십시오.

훌륭한. 이 신속한 결함을 해결하기 위해 충분히 감사합니다
Anton Tropashko

1
작품 또한 동기를 부여 실제로 구조체 대신 클래스를 사용하는 youtube.com/watch?v=_V2sBURgUBI
이삭 캐롤 와이즈 버그

슈퍼 팁입니다!
Peymankh

6
Xcode 11부터 구조체에서 Memberwise Initializer 생성을 사용할 수 있습니다!
Brock Batsell

환상적인 !!! 정답은 아니지만 매우 유용한 팁입니다! 많은 도움이되었습니다!
GuiOS


1

이제 전체 신속한 데이터 모델 파일을 라인 단위로 구문 분석하고 공개 액세스 수정 자, 공개 멤버 별 기본 초기화 프로그램 및 기타 항목을 별도의 자동 생성 출력 빠른 파일에 추가하는 루비 젬이 있습니다.

이 보석을 swift_republic 이라고 합니다

이 gem을 실행하려면 다음 설명서를 확인하십시오.

https://github.com/mehul90/swift_republic


1
멋진 해결책 !! 나는 이미 래퍼를 swift_republic만들고 잘 작동했습니다.
Md Shahed Hossain
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.