【问题标题】:How can I access properties from my subclasses?如何从我的子类访问属性?
【发布时间】:2019-05-29 14:46:08
【问题描述】:

我无法从我的子类访问属性。我已经定义了超类,然后我创建了从超类继承的子类。我在我的子类中初始化了我的超类。

我有一个名为 Box 的课程。在这个类中,我有一个名为 OfferType 的属性。

var Offer: OfferType?

我创建了 OfferType 类并在其中设置了一些属性。

class OfferType {

    var Name: String?
    var Image: UIImage?
    var Description: String?

    init(Name: String, Image: UIImage, Description: String) {
        self.Name = Name
        self.Image = Image
        self.Description = Description   
    }
}

比我创建了 OfferType 的 3 个子类

class Discount: OfferType {

    var Quantity: Int?

    init() {
        super.init(Name: "Discount", Image: UIImage(named: "Discount")!, Description: "nice")
    }   
}

class FreeShipping: OfferType  {

    var From: String?
    var To: String?

    init() {
        super.init(Name: "FreeShiping", Image: UIImage(named: "FreeShipping")!, Description: "lalaa")
    }   
}

class BoGoF: OfferType {

    lazy var SecondProduct = String()

    init() {
        super.init(Name: "BoGoF", Image: UIImage(named: "BoGoF")!, Description: "boh")
    }    
}

现在我试图在将子类分配为 BOX 类中的属性 Offer 之后获取子类的属性。

我做不到,Xcode 给我的唯一选择是访问超类(OfferType)的属性

我需要访问子类 Discount 的属性 Quantity。

这是我试图访问属性的地方

首先我将子类分配给类 Box 中的属性

newBox.Offer = 折扣

现在我正在尝试获取折扣的属性,但它没有给我

newBox.Offer。

我尝试过,但没有成功

我的类 newbox 是这样定义的

这就是 Box 类的定义方式

【问题讨论】:

  • 编辑这个并向我们展示你在说什么。我在这里看到了这些类,这是一个很好的开始,但我看不到您试图访问任何属性的位置。我想我知道你在说什么,这是一个快速的解决方法,但是,你能告诉我们吗?
  • 刚刚编辑
  • 向我们展示 newBox.offer 是如何定义的。没关系,看我的回答。

标签: swift class inheritance subclass


【解决方案1】:

您的newBox 实例可能具有定义为OfferTypeoffer 属性。

即使您将Discount 的实例放在offer 属性中,编译器也无法知道,因为您告诉编译器的只是offer 将包含OfferType。它无法知道将包含在那里的特定 OfferType

您必须将offer 转换为您期望的类型。我建议您查看asis。这是一个例子:

if let discount = newBox.offer as? Discount {
   print("Discount Quantity is \(discount.quantity)")
}

这里的as? 关键字基本上告诉编译器以下内容:

newBox.offerDiscount 的一种吗?如果是,则返回,否则, 返回零。

【讨论】:

  • 我之前尝试过这样做,它给了我错误类型老兄。
  • 请说明offernewBox 中是如何定义的。还要详细说明你得到的错误。
  • 您必须使用as? 而不是as!,否则 if...let 无效。
  • 完美的伙伴,它确实有效。我想了解一件事。这样做我将属性 Quantity 分配给我的实例 newBox 吗?还是恒定折扣?我的意思是,如果我需要在接下来的步骤中访问它,属性将被设置?
  • 您在Offer 属性上设置了Discount 的实例。因为DiscountOfferType 的一种,所以这是允许的。如果不进行强制转换(使用as?as!),系统只知道OfferTypeOffer 内部,它无法访问OfferType 的细节。我认为您的设计模式可能存在缺陷。在我看来,这可以通过enums 更优雅地解决。阅读:appventure.me/2015/10/17/advanced-practical-enum-examples
猜你喜欢
  • 2020-08-24
  • 1970-01-01
  • 2013-03-24
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多