【问题标题】:Change superclass property type on swift快速更改超类属性类型
【发布时间】:2017-07-29 00:43:17
【问题描述】:

在一个名为TableViewCell 的超类中,我有一个属性

class TableViewCell {
    var model: AnyObject?
}

在一个名为CountryTableViewCell的类中我写了这段代码

class CountryTableViewCell : TableViewCell {

    var model:[AnyObject]? {

        didSet {
            // do some stuff
        }
    }
}

我收到了这个错误

带有 [AnyObject] 的属性模型?无法覆盖具有类型的属性 任何物体?

不能把属性模型改成数组吗?

【问题讨论】:

  • 在 var model:[AnyObject] 之前尝试覆盖
  • 不起作用,同样的错误

标签: swift properties superclass


【解决方案1】:

不,你不能那样使用。如果使用 Swift 3,AnyObject 也应替换为 Any

你可以改变你的代码如下:

class TableViewCell {
    var model: Any?
}

class CountryTableViewCell : TableViewCell {

    override var model: Any? {
        didSet {
        }
    }
}

现在,如果您想在 didSet 中获取模型的数组,则可以按以下代码类型进行转换。

class CountryTableViewCell : TableViewCell {

        override var model: Any? {
            didSet {
               if let arrModel = model as? [Any] {
                  // Do Stuff...
               }
            }
        }
}

【讨论】:

  • 效果很好,谢谢。但我使用的是 swift 3,我使用的是 AnyObject,而不是 Any。这是个问题吗?
  • @J.Doe 从 Swift 3 开始,您将需要使用 Any 而不是 AnyObject。
  • 你有什么参考吗?这里他们说不一样medium.com/@mimicatcodes/…
  • @J.Doe 是的,它不一样,但最好使用它。由于 AnyObject 在 Swift 3 上有不同的用途。阅读此github.com/apple/swift-evolution/blob/master/proposals/…
【解决方案2】:

不,不能更改属性的类型。如果允许这样做,则会违反类型安全:

let subcell: CountryTableViewCell = CountryTableViewCell()
let supercell: TableViewCell = subcell
supercell.model = "anything that is not an array" as NSString
let wrong = subcell.model   // not an array!

@ParthAdroja's answer 显示了一个运行时解决方法。你不会在编译类型时得到一个数组,但至少你可以确保你在运行时有一个数组。

原则上,如果属性是只读的,子类中的这种特化应该可以工作(它与限制函数的返回类型相同),但它在 Swift 3 中不起作用。任何关心这个的人都可以提交向 Swift 团队提出 SE 请求 ☺。

(另外,Apple do have some magic to make it work with bridged Objective-C classes,但我们还不知道它是什么。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2016-06-02
    • 2019-11-26
    • 2017-01-07
    • 2016-10-29
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多