【问题标题】:Sometimes Classes treat like structures in swift?有时类在 swift 中像结构一样对待?
【发布时间】:2018-08-27 10:18:18
【问题描述】:

例如:- 在 DishPostedVC 类中,我有一个模型数组:- var finalDatesOfDish : [DishActivationDateTimeModel]?

如果我将此变量 (finalDatesOfDish) 传递给类 DishActivationVC,并在类 DishActivationVC 中执行一些删除操作,如果我再次返回类 DishPostedVC,那么我在删除后获取的数据不是实际数据,但我只是回来不传递任何数据。

不知道为什么,这种情况在模型数组之前又出现过一次,太奇怪了,怎么可能?

你能告诉我我应该做什么吗?

class DishActivationDateTimeModel {

var dayDate: Date? = nil
var dayDateStr: String = ""
var servingsLeft: String = ""
var firstSlotPostedDishId: String = ""
var secondSlotPostedDishId: String = ""

var startTimeDateForFirstSlot: Date? = nil
var startTimeStringForFirstSlot: String = ""
var endTimeDateForFirstSlot: Date? = nil
var endTimeStringForFirstSlot: String = ""

var startTimeDateForSecondSlot: Date? = nil
var startTimeStringForSecondSlot: String = ""
var endTimeDateForSecondSlot: Date? = nil
var endTimeStringForSecondSlot: String = ""
}

这是我的模特

【问题讨论】:

  • 类是引用类型,结构是 Swift 中的值类型。您正在将对象的引用传递给下一个视图控制器。
  • 是的 Rakesh,但我在这里使用类,如果我正在执行任何删除并返回然后它反映到它的主要对象但我没有传递数据或任何东西
  • 所以 rakesh 如果我从传递的引用中删除任何数据然后回来并想要实际数据然后我该怎么办?
  • 创建另一个实例并传递该实例或使用结构。
  • 好的 rakesha 我会尝试使用 Struct

标签: ios swift swift4 arrayobject


【解决方案1】:
  class DishActivationDateTimeModel {

    var dayDate: Date? = nil
    var dayDateStr: String = ""
    var servingsLeft: String = ""
    var firstSlotPostedDishId: String = ""
    var secondSlotPostedDishId: String = ""

    var startTimeDateForFirstSlot: Date? = nil
    var startTimeStringForFirstSlot: String = ""
    var endTimeDateForFirstSlot: Date? = nil
    var endTimeStringForFirstSlot: String = ""

    var startTimeDateForSecondSlot: Date? = nil
    var startTimeStringForSecondSlot: String = ""
    var endTimeDateForSecondSlot: Date? = nil
    var endTimeStringForSecondSlot: String = ""

    init(_ object : DishActivationDateTimeModel) {
        self.dayDate = object.dayDate
        self.dayDateStr = object.dayDateStr
//        ....
//        ....
        self.endTimeStringForSecondSlot = object.endTimeStringForSecondSlot
    }
}
extension Array where Element : DishActivationDateTimeModel {

    func copyModelArray() -> [DishActivationDateTimeModel] {
        var array : [DishActivationDateTimeModel] = []
        for object in self {
            array.append(DishActivationDateTimeModel(object))
        }
        return array
    }
}

如果您不想更改主要数据,请复制您的 使用copyModelArray 方法的模型数组。并使用您的操作 模型数组。因此,它不会影响您的主模型数据数组。

【讨论】:

  • 所以你说,每当用户从模型数组中删除对象并且他不保存并返回时,我需要调用这个方法,是吗?
  • 不,无论您正在执行哪个删除操作.. 对使用copyModelArray 方法创建的操作数组执行
  • 很高兴为您提供帮助.. :)
  • 这是我的荣幸兄弟 :)
【解决方案2】:

在 Swift 中,结构和类为您的对象提供了基于值和基于引用的构造。对于为数据存储而设计的对象(如 Array),结构体是首选​​。在多线程环境中传递对象时,结构还有助于消除内存问题。与结构不同,类支持继承,并且更多地用于包含 UIViewController 之类的逻辑。 Swift 中的大多数标准库数据对象,如 String、Array、Dictionary、Int、Float、Boolean,都是结构,因此是值对象。 var 与 let 的可变性是为什么在 Swift 中没有像 Objective C 的 NSArray 和 NSMutableArray 这样的可变和非可变版本的集合。

【讨论】:

    【解决方案3】:

    当你传递你的结构时,它被复制,但是当你传递或分配类时,它会引用它。这意味着当你在一个位置更改类对象时,它会在任何地方发生变化,当你影响结构时,它会单独更改。如果您想了解类和结构之间的更多信息差异,您可以查看我的文章。 classes versus structs

    【讨论】:

      猜你喜欢
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多