【问题标题】:Adding Swift Closures as values to Swift dictionary将 Swift 闭包作为值添加到 Swift 字典
【发布时间】:2014-07-31 20:13:22
【问题描述】:

我想创建一个 Swift 字典,其中包含 String 类型作为它的键和 Closures 作为它的值。以下是我拥有的代码,但它给了我错误:

'@lvalue 不等于'(String, () -> Void)'

class CommandResolver {
     private var commandDict:[String : () -> Void]!

     init() {
         self.setUpCommandDict();
     }

     func setUpCommandDict() {

         self.commandDict["OpenAssessment_1"] = {
                 println("I am inside closure");

          }
      }
  }

我尝试查看 StackOverflow 上关于字典中的闭包的其他问题,但它没有给我任何令人满意的答案。所以我真的很感谢这里的一些帮助。

【问题讨论】:

  • 试试self.commandDict["OpenAssessment_1"]! ...
  • @connor - 还是一样。另外,我不确定为什么我们需要编写 self.commandDict["OpenAssessment_1"]!。我正在尝试添加一个闭包,因为值和键不是可选的。我在这里错过了什么吗?

标签: ios swift closures


【解决方案1】:

这是要走的路。我不确定你的实现为什么不起作用。

class CommandResolver {

    typealias MyBlock = () -> Void

    private var commandDict:[String : MyBlock] = [String:MyBlock]()

    init() {
        self.setUpCommandDict();
    }

    func setUpCommandDict() {


        self.commandDict["OpenAssessment_1"] = {
            print("I am inside closure");

        }
    }
}

【讨论】:

  • 这个甚至适用于 Swift 2.x 和 Xcode 7.x。对我来说似乎是一个错误。
  • 有人在 Swift 3 中尝试过这个吗?
  • 您好,这应该适用于 Swift 3。您对此有任何问题吗?
【解决方案2】:

如果您在调用 setup 函数之前在 init 中初始化字典,它应该可以工作:

class CommandResolver {
    private var commandDict: [String: () -> Void]

    init() {
        commandDict = [:]
        setUpCommandDict()
    }

    func setUpCommandDict() {
        commandDict["OpenAssessment_1"] = {
            println("I am inside closure")
        }
    }
}

【讨论】:

  • 任何想法为什么?我的意思是我将我的字典声明为强制解包可选,因此默认情况下它应该是 nil,即使我在 setUpcommadDict() 中初始化它,它也不起作用。我必须在声明或 init() 期间对其进行初始化。关于为什么的任何想法?
  • '@lvalue is not same to '(String, () -> Void)' 之类的错误似乎经常是可选问题。隐式展开的可选项仍然是可选项,因此 self.commandDict["OpenAssessment_1"] 也是可选项。可能有其他方法可以解决这个问题,但我目前无法测试任何方法
  • 我不确定存储在可选字典中的值是否也是可选的(它未声明为可选)。无论如何,这个解决方案有效,我接受这个答案。
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多