2016-08-29 18 views
2

내 속성에서 반환하기 전에 값을 속성에 할당하려고합니다. 다음에 액세스 할 때 nil인지 확인한 후 다시 지정하거나 인스턴스를 리턴합니다.null-coalescing 연산자 및 재 생성 가능 속성에 대한 할당의 단축형입니까?

이 내가 지금하고 있어요 방법은 다음과 같습니다

private var _myProp: MyInstance? 

public var myProp: MyInstance { 
    if _myProp == nil { 
     _myProp = MyInstance() 
    } 
    return _myProp! 
} 

이 같은 매우 취소 스위프트을보고이 일을 더 우아한 방법을 기대했다. 나는 그것을 해제 할 수 있도록 속성 다시는 generatable 수 있도록하기 위해 노력하고있어

private var _myProp: MyInstance? 

public var myProp: MyInstance { 
    return _myProp ?? (_myProp = MyInstance()) 
} 

하지만 다음 번에 그것을 다시 한번 인스턴스를 생성합니다 액세스 할 수 있습니다 : 예를 들어, C#에서 나는이 작업을 수행 할 수 있습니다.

스위프트에서 이와 비슷한 것은 무엇입니까?

private var _property: MyClass? = nil 
public var property: MyClass { 
    if let property = _property { 
     return property 
    } else { 
     let property = MyClass() 
     _property = property 
     return property 
    } 
} 

그것은 아마도 당신이 좋아하는 것보다 더 자세한하지만 그 대가로 나는 그것이 매우 분명하다 생각 :

당신의 대답에 비추어
+0

내부 속성을 'nil'으로 재설정해야합니까? –

+1

'lazy var myProp = MyInstance()'는 어떻습니까? - 편집 : 아마 조쉬가 생각하는 것일 것입니다. –

+0

그러나 myProp = nil을 어딘가에 만들면 올바른 인스턴스가 다시 생성되지 않을까요? 속성을 re-generatable로 만들려고하므로'nil'으로 만들면 다시 인스턴스를 자동으로 만듭니다. – TruMan1

답변

1
스위프트의

비슷한 표기법은 다음과 같습니다

private var _myProp: MyInstance? 

public var myProp: MyInstance { 
    return _myProp ?? {_myProp = MyInstance(); return _myProp!}() 
} 

하지만 그것은 것을보고 정말 더-스위프트와 같은 또는 일반적입니다 모르겠어요 ...

이 패턴을 많이 사용하는 경우 , 그냥 다음과 같이 도움이되는 전역 함수를 만들 아마도 최선의 방법 :

func retrieve<T>(_ property:inout T?, withDefault value:T)->T { 
    if property == nil { 
     property = value 
    } 
    return property! 
} 

그런 다음 코드가됩니다 :

private var _myProp: MyInstance? 

public var myProp: MyInstance { 
    return retrieve(&_myProp, withDefault:MyInstance()) 
} 

제 경험상, 일반적으로 함수는 다른 사용자가 사용자 지정 연산자 나 오버로드보다 이해하고, 읽고 디버그하는 것이 더 쉽습니다.

+0

getter를 '변경'으로 표시해야합니다. –

+0

@ JoshCaswell : 수업이 아니라면. –

+0

오, 맞습니다. @ Martin. 내 바보 야. –

0

,이이 작업을 수행 할 수있는 "swiftiest"방법이라고 생각 어떤 선택 사항도 강제적으로 언랩하지 않습니다.

private var _myProp: MyInstance? 

public var myProp: MyInstance { 
    mutating get { 
     _myProp = _myProp ?? MyInstance() 
     return _myProp! 
    } 
} 

스위프트의 할당 연산자가 Void을하지 할당 된 값을 평가 할 수 있도록 :

+0

내부적으로 내 클래스에 있기 때문에'_myProp'을 할당 해제하고 'nil'로 만들고 싶습니다. 그러나이 속성에 외부에서 액세스하면 자동으로 인스턴스가 다시 생성됩니다. – TruMan1

+0

성능상의 이유입니까? 변수를 재설정하려는 경우 변수를 var로 만들 수 있고 변수를 nil로 설정하는 대신 새 인스턴스로 설정할 수 있습니다. – EmilioPelaez

+0

글쎄요. 일반인이기 때문에 소비자가 변수를 'var'로 변경하도록 허용하고 싶지 않습니다. – TruMan1

1

스위프트는 다음처럼 C# 코드에 굉장히 가까이 갈 수 있도록, 널 병합 연산자를 가지고있다 return 문에 해당 단어를 사용하십시오.

+2

그러나 속성이 이미 설정되어 있더라도 할당은 '_myProp = _myProp'을 수행합니다. 중요한지 확실하지 않습니다. –