스위프트 이니셜라이저|오브젝트 파트너 탐색

이 기사에서는 스위프트 이니셜라이저의 세부 정보를 살펴보겠습니다. 왜 그런 흥미로운 주제에 걸릴? 예를 들어,이전 목적 클래스의 신속한 버전을 만들려고 할 때 컴파일 오류로 인해 혼란스러워하는 경우가 종종 있기 때문입니다. 그래서 나는 스위프트 이니셜 라이저의 뉘앙스에 대한 더 나은 이해를 얻기 위해 더 깊이 파고 들기로 결정했습니다. 내 배경/경험은 대부분 그루비,자바 및 자바 스크립트로 작업하는 것과 관련이 있기 때문에 스위프트의 초기화 메커니즘 중 일부를 자바&그루비와 비교할 것입니다. 나는 엑스 코드에 놀이터를 발사하고 코드 예제를 직접 재생하는 것이 좋습니다. 나는 또한 너를 이 기사를 위해 정보의 1 차적인 근원 이는 스위프트 2.1 언어 가이드의 초기 설정 단면도로 읽는 격려한다. 마지막으로 값 유형(구조체)이 아닌 참조 유형(클래스)에 중점을 둡니다.

이니셜라이저란?

이니셜라이저는 구조체,클래스 또는 열거형의 새로 만든 인스턴스를 사용할 준비가 되기 전에 완전히 초기화되도록 하는 스위프트 구조체,클래스 또는 열거형의 특수한 유형의 메서드입니다. 그들은 자바와 그루비의”생성자”의 것과 같은 역할을한다. 이 예제에서는 다음과 같이 설명합니다.

하위 클래스는 일반적으로 이니셜라이저를 상속하지 않습니다

명심해야 할 첫 번째 사항 중 하나는 언어 가이드에 따르면”스위프트 하위 클래스는 기본적으로 수퍼 클래스 이니셜라이저를 상속하지 않습니다”입니다. 이 가이드에서는 수퍼 클래스 이니셜라이저가 자동으로 상속되는 시나리오가 있다고 설명합니다. 우리는 나중에 그 예외적 인 시나리오를 다룰 것입니다). 이것은 자바(및 확장,그루비)가 작동하는 방식과 일치합니다. 다음 사항을 고려하십시오:

마찬가지로 자바&그루비,그것은이 허용되지 않는 것이 의미가 있습니다(비록,대부분의 것들과 마찬가지로,이 점에 대한 몇 가지 인수가있을 수 있습니다. 이 스택 오버 플로우 게시물을 참조하십시오). 이 허용 된 경우,음악가의”악기”속성의 초기화는 잠재적으로 잘못된 상태로 음악가 인스턴스를 떠나,무시됩니다. 그러나 그루비와 함께 나는 일반적으로 이니셜 라이저(즉,생성자)를 작성하는 것을 귀찮게하지 않을 것입니다. 오히려,나는 그루비가 암시 적으로 제공하는 맵 생성자를 사용할 것입니다.이 생성자를 사용하면 건설시 설정하려는 속성을 자유롭게 선택하고 선택할 수 있습니다. 예를 들어,다음은 완벽하게 유효한 그루비 코드입니다.

수퍼 클래스에서 제공하는 속성을 포함하여 모든 속성을 포함 할 수 있지만 모두(또는 일부)를 지정할 필요는 없으며 특정 순서로 지정할 필요가 없습니다. 매우 유연한 이니셜의이 종류는 스위프트에 의해 제공되지 않습니다. 스위프트에서 가장 가까운 것은 구조체에 대해 자동으로 제공되는 멤버 단위 이니셜 라이저입니다. 그러나 멤버 와이즈 이니셜 라이저에서 인수의 순서는 중요하지만 이름이 지정되어 있으며 정의 된 순서에 따라 다릅니다.
어쨌든 클래스로 돌아 가기-건설 후 객체 유효성에 관한 그루비의 철학은 분명히 스위프트와 매우 다릅니다.이것은 그루비가 스위프트와 다른 여러 가지 방법 중 하나 일뿐입니다.

지정 및 편의 이니셜라이저

토끼 구멍 아래로 너무 멀리 가기 전에 중요한 개념을 명확히 해야 합니다: 스위프트에서 이니셜라이저는 지정된 이니셜라이저 또는 편의 이니셜라이저로 분류됩니다. 나는 개념적으로나 구문 적으로 그 차이를 설명하려고 노력할 것이다. 각 클래스에는 지정된 이니셜 라이저가 하나 이상 있어야하지만 여러 개가있을 수 있습니다(“지정됨”은”단일”을 의미하지 않음). 지정된 이니셜라이저는 기본 이니셜라이저로 간주됩니다. 그들은 머리 혼초입니다. 궁극적으로 모든 속성이 초기화되었는지 확인해야 할 책임이 있습니다. 그 책임 때문에 때로는 여러 인수가 필요할 수 있으므로 지정된 이니셜 라이저를 항상 사용하는 것이 어려울 수 있습니다. 여러 속성을 가진 클래스로 작업하고 하나 또는 두 개의 속성을 제외하고 거의 동일한 해당 클래스의 인스턴스를 여러 개 만들어야한다고 상상해보십시오. (인수를 위해 선언 될 때 속성에 할당 될 수있는 합리적인 기본값이 없다고 가정 해 봅시다.) 예를 들어,우리 사람 클래스도 먹었다고합시다.음식과 즐기는 음악 속성. 물론,그 두 가지 사실 대부분의 시간에 설정 될 것 이라고 하지만 당신은 절대 모릅니다. 보세요:

이제 우리 사람 클래스는 설정해야 할 네 가지 속성을 가지고 있으며 작업을 수행 할 수있는 지정된 이니셜 라이저가 있습니다. 지정된 이니셜라이저는 4 개의 인수를 사용하는 첫 번째 이니셜라이저입니다. 대부분의 경우,그 마지막 두 인수는”참”값을 가질 것입니다. 우리가 전형적인 사람을 만들고 싶을 때마다 그들을 계속 지정해야하는 것은 고통 스러울 것입니다. 마지막 두 이니셜 라이저가 들어오는 곳,편의 수정으로 표시된 것들입니다. 이 패턴은 자바 개발자에게 익숙한 보일 것입니다. 항상 처리하는 데 필요한 것보다 더 많은 인수를 사용하는 생성자가 있는 경우 해당 인수의 하위 집합을 사용하고 다른 인수에 대한 적절한 기본값을 제공하는 간단한 생성자를 작성할 수 있습니다. 편의 이니셜 라이저는 다른,아마도 덜 편리한 편의 이니셜 라이저 또는 지정된 이니셜 라이저에 위임해야합니다. 궁극적으로 지정된 이니셜 라이저가 참여해야합니다. 또한 하위 클래스 인 경우 지정된 이니셜 라이저는 즉각적인 수퍼 클래스에서 지정된 이니셜 라이저를 호출해야합니다.

편의성 수정자를 사용하는 실제 사례 중 하나는 다음과 같습니다. 나는 당신이 경로를 지정하는 몇 가지 방법이 있다고 상상할 수 있다고 확신합니다. 이 응용 프로그램은 다음과 같은 몇 가지 편의 이니셜 라이저를 제공합니다:

공공 편의 초기화(직사각형:직각)
공공 편의 초기화(원형:직각)
공공 편의 초기화(원형:직각)
공공 편의 초기화(원형:직각)
공공 편의 초기화(원형:직각)
공공 편의 초기화(원형:직각)
공공 편의 초기화(원형:직각)
공공 편의 초기화(원형:직각)2018 년 11 월 1 일(토)~2018 년 12 월 11 일(일)~2018 년 12 월 11 일(일)~2018 년 12 월 11 일(일): 이전에,나는 클래스가 여러 개의 지정된 이니셜 라이저를 가질 수 있다고 말했다. 어떻게 생겼을까요? 지정된 이니셜 라이저와 편의 이니셜 라이저간에 컴파일러에 의해 시행되는 한 가지 중요한 차이점은 지정된 이니셜 라이저가 동일한 클래스의 다른 이니셜 라이저에 위임 할 수는 없지만 즉각적인 수퍼 클래스에서 지정된 이니셜 라이저에 위임해야한다는 것입니다. 사람의 두 번째 이니셜 라이저 봐,”언데드”라는 하나의 인수를 취 하나. 이 이니셜라이저는 편의성 한정자로 표시되지 않으므로 스위프트는 지정된 이니셜라이저로 취급합니다. 따라서 다른 이니셜라이저에 직접 위임할 수 없습니다. 처음 네 줄을 주석 처리하고 마지막 줄을 주석 해제하십시오. 컴파일러는 불평 할 것이다,엑스 코드는 편의 수정을 추가하여 문제를 해결할 것을 제안하여 당신을 돕기 위해 시도해야합니다.

이제 뮤지션의 하위 클래스를 고려하십시오. 단일 이니셜라이저가 있으므로 지정된 이니셜라이저여야 합니다. 따라서 즉시 수퍼 클래스 인 사람의 지정된 이니셜 라이저를 호출해야합니다. 기억하십시오:지정된 이니셜 라이저는 동일한 클래스의 다른 이니셜 라이저에 위임 할 수 없지만 편의 이니셜 라이저는 그렇게해야합니다. 또한 지정된 이니셜 라이저는 즉각적인 수퍼 클래스의 지정된 이니셜 라이저를 호출해야합니다. 자세한 내용(및 예쁜 그래픽)은 언어 가이드를 참조하십시오.

초기화 단계

스위프트 언어 가이드에서 설명 하듯이 두 가지 초기화 단계가 있습니다. 이 단계는 지정된 이니셜라이저에 대한 호출로 구분됩니다. 1 단계는 슈퍼 클래스 지정된 이니셜 라이저에 대한 호출 이전이며 2 단계는 이후입니다. 하위 클래스는 1 단계에서 자체 속성을 모두 초기화해야하며 2 단계까지는 수퍼 클래스에 의해 정의 된 속성을 설정할 수 없습니다.
다음은 언어 가이드에 제공된 샘플에서 가져온 코드 샘플로,지정된 수퍼 클래스 이니셜라이저를 호출하기 전에 하위 클래스의 자체 속성을 초기화해야 함을 보여줍니다. 수퍼 클래스가 지정한 이니셜라이저를 호출할 때까지 수퍼 클래스에서 제공하는 속성에 액세스할 수 없습니다. 마지막으로 지정된 수퍼 클래스 이니셜라이저가 호출된 후에는 상수 저장된 속성을 수정할 수 없습니다.

이니셜라이저 재정의

이제 서브클래스는 일반적으로 이니셜라이저를 상속하지 않으며,지정된 이니셜라이저와 편의 이니셜라이저의 의미와 구별에 대해 명확히 알 수 있으므로,서브클래스가 이니셜라이저를 즉시 슈퍼클래스에서 재정의하도록 할 때 어떤 일이 발생하는지 생각해 봅시다. 이니셜라이저에는 두 가지 유형이 있다는 점을 감안하면 네 가지 시나리오가 있습니다. 그래서 각각의 경우에 대한 간단한 코드 예제와 함께,하나씩 보자:

슈퍼 클래스와 일치하는 지정된 이니셜 라이저 지정된 이니셜 라이저
이것은 일반적인 시나리오입니다. 이렇게 할 때 재정의 한정자를 적용 해야 합니다. 이 시나리오는 자동으로 제공되는 기본 이니셜 라이저를”재정의”하는 경우(즉,수퍼 클래스가 명시 적 이니셜 라이저를 정의하지 않는 경우)에도 적용됩니다. 이 경우,스위프트는 암시 적으로 하나를 제공합니다. 자바 개발자는이 동작을 잘 알고 있어야합니다). 이 자동으로 제공되는 기본 이니셜 라이저는 항상 지정된 이니셜 라이저입니다.
슈퍼클래스 편의 이니셜라이저와 일치하는 지정된 이니셜라이저
이제 상위 클래스의 편의 이니셜라이저와 일치하는 지정된 이니셜라이저를 하위 클래스에 추가한다고 가정해 보겠습니다. 언어 가이드에 배치된 이니셜라이저 위임 규칙에 따라 하위 클래스 지정 이니셜라이저는 직접 슈퍼클래스의 지정된 이니셜라이저까지 위임해야 합니다. 즉,부모의 일치 편의 이니셜라이저까지 위임할 수 없습니다. 인수를 위해 하위 클래스가 수퍼 클래스 이니셜라이저를 상속할 자격이 없다고 가정합니다. 그런 다음 수퍼 클래스 편의 이니셜 라이저를 직접 호출하여 하위 클래스의 인스턴스를 만들 수 없으므로 일치하는 편의 이니셜 라이저는 어쨌든 초기화 프로세스에 관여하지 않으며 결코 포함될 수 없습니다. 따라서 실제로 재정의하지 않고 재정의 한정자가 적용되지 않습니다.

슈퍼클래스 지정 이니셜라이저와 일치하는 편의 이니셜라이저
이 시나리오에서는 하나 이상의 부모 클래스 속성에 할당된 값에서 기본값이 계산될 수 있지만 반드시 계산할 필요는 없는 자체 속성을 추가하는 하위 클래스가 있다고 가정합니다. 또한 하위 클래스에 대해 하나의 지정된 이니셜 라이저 만 갖고 싶다고 가정 해보십시오. 서명이 부모 클래스의 지정된 이니셜 라이저와 일치하는 하위 클래스에 편의 이니셜 라이저를 추가 할 수 있습니다. 이 경우 새 이니셜 라이저에는 편의성 및 재정의 한정자가 모두 필요합니다. 이 경우를 설명하는 유효한 코드 샘플은 다음과 같습니다.
수퍼 클래스 편의 이니셜 라이저와 일치하는 편의 이니셜 라이저
수퍼 클래스의 편의 이니셜 라이저의 서명과 일치하는 편의 이니셜 라이저를 하위 클래스에 추가하려면 바로 진행하십시오. 위에서 설명했듯이 어쨌든 편의 이니셜 라이저를 무시할 수는 없습니다. 따라서 편의 수정자를 포함 시키지만 재정의 수정자를 생략하고 다른 편의 이니셜 라이저와 마찬가지로 처리하십시오.

이 섹션의 한 가지 주요 테이크 아웃은 재정의 한정자가 수퍼 클래스 지정된 이니셜 라이저를 재정의하는 경우에만 사용되며 사용해야한다는 것입니다. (여기서 할 사소한 설명:필요한 이니셜 라이저를 재정의하는 경우 재정의 한정자 대신 필요한 한정자를 사용합니다. 필수 한정자는 재정의 한정자를 의미합니다. 아래의 필수 이니셜라이저 섹션을 참조하십시오).

이니셜라이저가 상속될 때

이제 슈퍼클래스 이니셜라이저가 상속되는 앞서 언급한 시나리오에 대해 설명합니다. 스위프트 언어 가이드에서 설명 하듯이 하위 클래스가 선언 시 자체 속성의 모든 기본값을 제공하고 자체 지정된 이니셜라이저를 정의하지 않으면 자동으로 모든 수퍼 클래스 지정된 이니셜라이저를 상속합니다. 또는 하위 클래스가 모든 수퍼 클래스 지정된 이니셜 라이저의 구현을 제공하는 경우 모든 수퍼 클래스 편의 이니셜 라이저를 자동으로 상속합니다. 이는 클래스(및 구조체)의 초기화가 저장된 속성을 불확정 상태로 남겨 두지 않아야한다는 스위프트의 규칙과 일치합니다.

편의 이니셜 라이저,지정된 이니셜 라이저 및 상속 규칙을 실험하면서”흥미로운”동작을 발견했습니다. 나는 그것이 실수로 악순환을 설정하는 것이 가능하다는 것을 발견했다. 다음 예를 고려하십시오.

그러나 음식 편의 이니셜 라이저는 합리적으로 자체 지정된 이니셜 라이저에 위임합니다.이 이니셜 라이저는 레시피 성분 하위 클래스에 의해 재정의되었습니다. 따라서 호출되는 초기화(이름:문자열)이니셜 라이저의 음식 버전이 아니라 레시피 성분의 재정의 된 버전입니다. 재정의 된 버전은 서브 클래스가 음식의 편의 이니셜 라이저를 상속한다는 사실을 활용,거기에있다-당신은주기가. 나는 이것이 프로그래머 실수 또는 컴파일러 버그로 간주 될지 모른다(나는 그것을 버그로보고했다:https://bugs.swift.org/browse/SR-512). 음식은 제 3 자의 클래스이며 소스 코드에 액세스 할 수 없으므로 실제로 구현되는 방법을 모른다고 상상해보십시오. 이 예제에 표시된 방식으로 사용하면 사이클에 갇히게된다는 것을(런타임 전까지)알 수 없습니다. 그래서 컴파일러가 여기서 우리를 도왔다면 더 좋을 것이라고 생각합니다.

실패 가능 이니셜라이저

특정 불변량을 가진 클래스를 디자인했으며 클래스의 인스턴스가 만들어진 순간부터 해당 불변량을 적용하려고 한다고 상상해보십시오. 예를 들면,어쩌면 너는 청구서를 만들고 있다 그리고 너는 총계가 항상 부정 이다 것 을 확인하고 싶는다. 두 번 유형의 양 인수를 취하는 이니셜 라이저를 추가 한 경우,어떻게 당신이 당신의 불변성을 위반하지 않도록 할 수 있습니까? 한 가지 전략은 인수가 부정적이지 않은지 확인하는 것입니다. 이 경우,그것을 사용. 그렇지 않으면 기본값은 0 입니다. 예:

이 작업은 작동하며 이니셜 라이저가 수행하는 작업을 문서화하는 경우(특히 다른 개발자가 클래스를 사용할 수 있도록 계획 한 경우)허용 될 수 있습니다. 하지만 당신은 힘든 시간을 그 전략을 방어 할 수 있습니다,이 종류의 양탄자 아래 문제를 청소 않기 때문에. 스위프트가 지원하는 또 다른 방법은 초기화가 실패 할 수 있도록하는 것입니다. 즉,이니셜 라이저를 실패 할 수 없게 만들 것입니다.

이 문서에서 설명 하는 대로 실패할 수 있는 이니셜라이저 제거 하거나 개체 생성 하는 동안”이전에 실패 보고 하는 유일한 방법”공장 메서드에 대 한 필요성을 줄이기 위해 스위프트에 추가 되었습니다. 이니셜 라이저를 실패 할 수 있도록하려면,당신은 단순히 추가? 또는! 초기화 키워드 뒤에 문자(즉,초기화? 또는 초기화! ). 그런 다음 모든 속성을 설정하고 위임에 관한 다른 모든 규칙을 충족 한 후 인수가 유효한지 확인하는 논리를 추가합니다. 그들이 유효하지 않은 경우,당신은 반환 전무와 초기화 실패를 트리거. 이는 이니셜라이저가 아무 것도 반환하지 않는다는 것을 의미하지는 않습니다. 여기에 우리의 송장 클래스는 실패 이니셜 라이저와 함께 보일 수있는 방법은 다음과 같습니다:
우리가 객체 생성의 결과를 사용하는 방법에 대한 다른 아무것도 통지? 그것은 마치 우리가 그것을 선택 사항으로 취급하는 것과 같습니다. 글쎄,그게 정확히 우리가하고있는 일입니다! 실패 할 수없는 이니셜 라이저를 사용하면 초기화 실패가 트리거 된 경우 또는 선택적(송장)이 발생합니다. 즉,초기화에 성공하면 관심 있는 인보이스 인스턴스를 래핑하는 옵션으로 끝날 것이므로 래핑을 해제해야 합니다. (제쳐두고,자바는 또한 자바 8 과 같은 옵션을 가지고 있습니다).

실패 가능 이니셜라이저는 재정의 및 위임,지정 대 편의성 등과 관련하여 논의한 다른 유형의 이니셜라이저와 같습니다. 그러나 사용할 수 없는 이니셜라이저를 실패할 수 없는 이니셜라이저로 재정의할 수는 없습니다.이 두 가지 모두 실패 할 수있는 이니셜 라이저 초기화를 제공합니까?(코더 아데코더:엔코더). 이 이니셜라이저는 뷰 또는 뷰 컨트롤러가 펜촉에서 로드될 때 호출됩니다. 실패 가능 이니셜라이저의 작동 방식을 이해하는 것이 중요합니다. 나는 강하게 당신이 철저한 설명을 위해 스위프트 언어 가이드의 실패 이니셜 라이저 섹션을 읽어 보시기 바랍니다.

필수 이니셜라이저

필수 한정자는 모든 하위 클래스가 영향을 받는 이니셜라이저를 구현해야 함을 나타내는 데 사용됩니다. 그것의 얼굴에,그것은 매우 단순하고 간단 소리. 위에서 설명한 이니셜라이저 상속에 관한 규칙이 어떻게 작동하는지 이해하지 못하면 때때로 약간 혼란 스러울 수 있습니다. 하위 클래스가 수퍼 클래스 이니셜라이저가 상속되는 기준을 충족하는 경우 상속된 이니셜라이저 집합에 필수 항목이라고 표시된 항목이 포함됩니다. 따라서 하위 클래스는 필수 한정자에 의해 부과된 계약을 암시적으로 충족합니다. 그것은 필요한 이니셜 라이저를 구현합니다,당신은 단지 소스 코드에서 그것을 볼 수 없습니다.

서브클래스가 필수 이니셜라이저의 명시적(즉,상속되지 않은)구현을 제공하는 경우 수퍼 클래스 구현도 재정의합니다. 필수 한정자는 재정의를 의미하므로 재정의 한정자는 사용되지 않습니다. 당신이 원하는 경우에 당신은 그것을 포함 할 수 있지만,이렇게하면 중복 될 것이며,엑스 코드는 그것에 대해 당신을 잔소리 것입니다.

스위프트 언어 가이드는 필요한 수정 자에 대해 많이 말하지 않으므로 코드 샘플(아래 참조)을 주석으로 준비하여 목적을 설명하고 작동 방식을 설명했습니다. 자세한 내용은,앤서니 레빙스에 의해이 문서를 참조.스위프트 이니셜라이저에 대해 깊이 파고들었던 것 중 하나는 초기화 논리를 복제하지 않고 지정된 이니셜라이저 집합을 만드는 방법을 알아내려는 시도였습니다. 예를 들어,레이 웬 덜리히의 이 튜토리얼을 통해 작업하고 있었습니다. 이 자습서를 보면 지정된 이니셜라이저 둘 다 일반적인 초기화 작업을 수행하는 데 사용하는 기본 초기화 메서드가 있는 것을 확인할 수 있습니다. 그것은 나에게 좋은 접근 방식 인 것 같습니다-당신은 그 이니셜 라이저 각각에 그 물건을 복제하고 싶지 않습니다. 나는 그 기술을 내 스위프트 버전의 라이트 뷰로 재현하고 싶었다. 그러나 지정된 이니셜 라이저가 동일한 클래스의 다른 이니셜 라이저에 위임 할 수 없으며 수퍼 클래스 이니셜 라이저에 위임 할 때까지 자체 클래스의 메소드를 호출 할 수 없기 때문에 어려운 것으로 나타났습니다. 그 시점에서 상수 속성을 설정하기에는 너무 늦었습니다. 물론 상수를 사용하지 않음으로써 이 제한을 해결할 수 있지만 이는 좋은 해결책이 아닙니다. 그래서 나는 그들이 선언 된 저장된 속성에 대한 기본값을 제공하는 것이 가장 좋다고 생각했습니다. 그것은 여전히 내가 현재 알고있는 최고의 솔루션입니다. 그러나 이니셜 라이저를 사용하는 대체 기술을 알아 냈습니다.

다음 예제를 살펴보십시오. 이 경우,이 문제를 해결할 수 있습니다.스위프트,이는 내 스위프트 포트 오브 래트 뷰의 대체 버전입니다. 이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,이 경우,(코더 아데코더:엔코더)이니셜라이저. 우리는 또한 사용자 뷰의 초기화(프레임)의 명시 적 구현을 제공 할 것입니다: 초기화 프로세스가 일관성이 있는지 확인합니다. 어떤 이니셜라이저가 사용되는지에 관계없이 저장된 속성을 같은 방식으로 설정해야 합니다.
편의성 수정자를 재정의된 버전의 이니셜라이저에 추가했습니다. 또한 재정의 된(편의성)이니셜 라이저가 모두 위임하는 하위 클래스에 실패 할 수있는 지정된 이니셜 라이저를 추가했습니다. 이 단일 지정된 이니셜 라이저는 저장된 모든 속성을 설정합니다(상수 포함-나는 모든 것을 위해 바르 사용에 의지 할 필요가 없었습니다). 그것은 작동하지만,나는 그것이 꽤 미봉책이라고 생각합니다. 난 그냥 그들이 선언 된 내 저장된 속성에 대한 기본값을 제공하는 것을 선호하지만,필요한 경우이 옵션이 존재 알고하는 것이 좋다.

You might also like

답글 남기기

이메일 주소는 공개되지 않습니다.