使用AnyObject访问swift词典成员

问题描述 投票:1回答:2

我在理解如何正确地在Swift中解包时遇到了麻烦。情况如下:

我有这两个类:

class Alpha
{
  var val: Int

  init(x: Int)
  {
    val = x
  } 

  func doSomething() -> Int
  {
    // does stuff and returns an Int value
    return val
  }
}

和第二个类,它是第一个类的子类

class Beta: Alpha
{
  var str: [String] = []

  override init(x: Int)
  {
    super.init(x)
  }

  func doSomething() -> String
  {
    // does stuff and returns a String
    return str
  }
}

到目前为止一切顺利,这两个类按预期工作。但是现在我想创建一个字典来存储这些类对象中的几个。所以我创建了一个类来管理字典并向其添加项目。

class Gamma
{
  var myDict: [String:AnyObject] = [:]

  func addAlphaToDict(key: String, val: Int)
  {
    self.myDict[key] = Alpha(x: val).self
  }

  func addBetaToDict(key: String, val: Int)
  {
    self.myDict[key] = Beta(x: val).self
  }
}

这也有效,但我认为这可以以某种方式得到改善。我现在遇到的问题是当我尝试访问字典中的值时:

var foo = Gamma()

foo.addAlphaToDict(key: "blah", val: 45)
foo.addBetaToDict(key: "bluh", val: 23)

var result1 = (foo.myDict["blah"] as! Alpha).doSomething()

var result2 = (foo.myDict["bluh"] as! Beta).doSomething()

我发现这里的语法非常笨重,我觉得我做错了,即使它有效。我是一名经验丰富的开发人员,但刚刚开始使用Swift,所以我对某些事情并不十分确定。拥有更多Swift经验的人能告诉我如何改进这些代码,或者指出我应该走向的方向吗?谢谢!

swift dictionary syntax
2个回答
1
投票

如果你想要一个具有有限数量可能性的异构类型,那么更喜欢将enumAnyAnyObject相关联的值。然后,您可以使用switch以详尽且安全的方式恢复类型。

import UIKit
import PlaygroundSupport

enum DictionaryValues {
    case integer(Int), string(String)
}

let dictionary: [String: DictionaryValues] = ["a": .integer(1), "b": .string("xyz")]

for (key, value) in dictionary {
    switch value {
    case .integer(let number):
        print("Key \(key) is a number: \(number)")
    case .string(let text):
        print("Key \(key) is text: \(text)")
    }
}

2
投票

在这种情况下,您可以使用Alpha而不是AnyObject作为字典值。只要在需要的时候将它转发给Beta。应尽可能避免使用AnyObjectAny作为字典键。

但是,我不得不说这种做法很糟糕。您需要有一个更清晰的逻辑来决定密钥何时是Beta,而不仅仅是知道您传递给字典的密钥。

© www.soinside.com 2019 - 2024. All rights reserved.