2017-11-18 1 views
-1

인터넷에서 많은 장소와 커뮤니티를 검색하여이 문제가 무엇인지 찾아냅니다. 프로그래밍 구문.이 상황에서 사전에있는 신속한 물음표 연산자를 이해할 수 없습니다. [전환]

나는이 코드의 지침을 필사적으로 찾고 있습니다.

이러한 특정 선언에서 컴파일러는 어떻게됩니까? 무엇이다 -

  1. 첫 번째 상황 :

    transitions[prev]?[transition] 
    transitions[state]?[transition] != nil 
    

    이 클래스가이 변수

    public var state: State 
    
    
    private var transitions = [State:[Transition:State]]() 
    

    그리고 이것들은 예입니다

    public final class StateMachine<State: Hashable, Transition: Hashable> 
    

    을 선언하는 방법입니다 전환에서 일어나는 [ ? 이전] [전환]

    public final func advance(transition: Transition, observe: Observer? = nil) -> State { 
    let prev = state 
    if let next = transitions[prev]?[transition], next != prev { 
        state = next 
        observe?(prev, next) 
    } 
    
    return state 
    
  2. 두 번째 상황 -?! 반환 전환 [주] [전환]에서 어떤 일이 일어나고 무엇 = 내가 원하는 전부 그

    public final func canAdvance(transition: Transition) -> Bool { 
        return transitions[state]?[transition] != nil 
    } 
    

전무 알다. 이 순간에 무슨 일이 일어나고 있습니까?

+2

읽어 보시기 바랍니다 [스위프트 언어 가이드 : 옵션 체인 (https://developer.apple.com/library/content/documentation/ 당신은 당신이 nil이처럼 찾을 수 없음을 보장 할 수없는 한 그렇게해서는 안 Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html # // apple_ref/doc/uid/TP40014097-CH21-ID245) – vadian

+0

읽었습니다. 하지만 전이를 이해하는 데 아직도 어려움이 있습니다. [전환] –

답변

0

간단히 말해서, transitions[state]?[transition]은 0 일 수 있습니다.

그래서, if let next = transitions[prev]?[transition] 언랩이 변수는 물음표 연산자 스위프트에 선택성을 나타내면 괄호

if let next = transitions[prev]?[transition] { 
// this code executes here if 'transitions[prev]?[transition]' is not nil 
    state = next 
    observe?(prev, next) // this closure possibly can be nil. if nil Swift just skips this line 
} 
+0

제 자신을 분명히하지 않았고 미안하다고 생각합니다. 나는 let이 어떻게 작동하는지 이해하지만 내 문제는 그가 [transition] [transition]과 같은 것을 읽을 때 컴파일러가하는 것을 이해하는 것이었다. 그가 무엇을 할 것입니까? 예를 들어, [상태]에서 첫 번째 키 - 값을 찾고 [전환]으로 이동하거나 그가 [상태]에서 nil을 풀면 그는 종료하거나 [전환]으로 전환합니다. –

+0

@VictorOliveira'transition [prev]'가 nil이면 전체 표현식이 nil입니다. 명백합니까? – Vyacheslav

0

내부 알고리즘을 움직인다.

많은 것들을 옵션으로 선언 할 수 있습니다. 즉, nil이거나 값을 보유 할 수 있습니다. 여기에는 예를 들어 variable declarations, computed properties, return values of functionscallbacks/closures이 포함됩니다. 또한 사전에서 값을 캐스팅하거나 검색하는 것과 같은 특정 연산은 선택적 값을 산출합니다.

포함 된 값을 사용하려면 해당 값을 사용하지 않도록해야합니다. 원인이 없으므로 nil을 가리킬 수 있습니다. 언 래핑과 선택성 연쇄에는 여러 가지 방법과 형태가 있습니다.

Explaing 특정 예 : 사전에


myDict[myKey]는 옵션 값을 반환에 같은 키를 통해 저장된 값을 검색. 특정 사전에 저장된 키의 값은 다른 사전입니다. transitions[state]?[transition]을 선언하면 기본적으로 "state 키 사전을 찾았 으면이 사전을 계속 사용하고 해당 사전에 대해 transition 키의 값을 얻습니다. 그렇지 않으면"nil "을 사용합니다.

이 코드 :

return transitions[state]?[transition] != nil 

는 기본적으로이 글을 쓰는 짧은 방법입니다 :

if let stateDict = transitions[state] { 
    return stateDict[transition] != nil 
} else { 
    return false 
} 

다른 예제는 함수에 전달 옵션 폐쇄에 관한 것입니다. 선택적 클로저를 함수에 전달하고 closure?()을 통해 호출 할 수도 있습니다. ?은 클로저에 대해 nil이 전달되면 아무 것도 수행하지 않아야하며, 그렇지 않으면 실행해야 함을 나타냅니다.

이 코드 :

if let observeClosure = observe { 
    observeClosure(prev, next) 
} 

좀 더 선택성의 설명 :

(선택 사양)와 함께 작업하는 경우

observe?(prev, next) 

는 기본적으로이 글을 쓰는 짧은 방법입니다 안전하게 언 랩핑 할 수있는 선언 된 변수의 값 그것과 같이 : nil 경우

func square(myValue: Int?) → Int { 
    guard let myValue = myValue else { 
     return 0 
    } 
    return myValue * myValue 
} 

또는

func square(myValue: Int?) → Int { 
    if let myValue = myValue { 
     return myValue * myValue 
    } else { 
     return 0 
    } 
} 

하거나 ?? 연산자로 대체를 정의 할 수

func square(myValue: Int?) → Int { 
    return myValue ?? 0 * myValue ?? 0 
} 

또한 안전하지 풀다하기 위해 ! 연산자를 사용하고 수 앱이 다운되는 것을 발견했습니다.

func square(myValue: Int?) → Int { 
    if myValue != nil { 
     myValue! * mayValue! { 
    } else { 
     return 0 
    } 
} 
+0

감사합니다! 당신은 정말로 도왔습니다. 이것은 내가이 선언에서 실제로 일어나고있는 것을 이해하는 데 필요한 설명입니다 [국가] [전환] –

+0

기꺼이 도와 드리겠습니다. 나는 선택도에 대한 더 많은 설명을 추가하기 위해 나의 대답을 조금 더 수정할 것이다. – erikmartens

관련 문제