0

我在互联网上的很多地方和社区中进行了搜索,以找出这种编程语法到底发生了什么。

我正在拼命地寻求此代码中的指导。

在这些特定声明中编译器发生了什么?

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

这就是类的声明方式

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

这是变量

public var state: State


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

这些是例子:

  1. 第一种情况 - 过渡中发生了什么[prev]?[transition]

    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. 第二种情况 - return transitions[state]?[transition] != nil 中发生了什么

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

这就是我想了解的全部。在这些时刻发生了什么?

4

2 回答 2

1

问号运算符表示 Swift 中的可选性。

您可以将许多事物声明为可选,这意味着它们可以是nil或持有一个值。这包括例如variable declarationscomputed propertiesreturn values of functionscallbacks/closures此外,某些操作(如从字典中转换或检索值)将产生可选值。

当您想使用包含的值时,您必须解开它们,因为可能没有,并且 可能指向nil. 展开和可选链接的方式和形式有很多。

解释您的特定示例:


在字典中通过键检索存储的值,如myDict[myKey]返回一个可选值。存储在特定字典中的键的值是另一个字典。通过声明transitions[state]?[transition]您基本上说“如果找到了 key 的字典state,请继续使用这个字典并获取该字典的 key 的值transition,否则使用 nil”。

这段代码:

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

基本上是一种更短的写法:

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

您的另一个示例是关于传递给函数的可选闭包。您还可以将可选闭包传递给函数并通过closure?(). 表示如果为闭包传递了 nil ,?则不应执行任何操作,否则应执行。

这段代码:

observe?(prev, next)

基本上是一种更短的写法:

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

更多可选性解释:

如果您使用声明变量中的可选值,您可以像这样安全地解开它:

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
}

您还可以使用!运算符不安全地打开包装,如果nil发现您的应用程序将崩溃。你永远不应该这样做,除非你能保证nil不能像这样找到:

func square(myValue: Int?) → Int {
    if myValue != nil {
        myValue! * mayValue! {
    } else {
        return 0
    }
}
于 2017-11-18T20:16:48.590 回答
0

简而言之,transitions[state]?[transition]有时可以为零。

因此,if let next = transitions[prev]?[transition]展开此变量会将算法移动到 if 括号内

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
}
于 2017-11-18T20:16:13.563 回答