【问题标题】:Pass array of objects into another class将对象数组传递给另一个类
【发布时间】:2018-01-22 01:48:11
【问题描述】:

我已经为我的AchievementObject 类创建了一个achievementArray,并附加了所有必要的值。出于测试目的,我对第一个索引进行了硬编码。我想将此数组传递给我的AchievementDatabase 类,以便检查数组的大小。 (我想在集成我的实际数据库之前让客户端工作)。

我收到此错误:

无法将 AppDelegate.AchievementObject.Type 类型的值转换为预期的参数类型 AppDelegate.AchievementObject

这是我的相关代码,都在AppDelegate.swift文件中:

var achievementArray = [AchievementObject]();
achievementArray.append(AchievementObject(achievementID: -1, achievementName: "achievementName", achievementDescription: "achievementDescription")); //Append to allow subscripting

achievementArray[1].achievementID = 1;
achievementArray[1].achievementName = "Hello World!";
achievementArray[1].achievementName = "Be Born!";

debugPrint(achievementArray[1].achievementName); //Returns Hello World!

var achievementDB = AchievementDatabase(achievementArray: AchievementObject); *<-- Error Here*

class AchievementObject {

    var achievementID: Int;
    var achievementName: String;
    var achievementDescription: String;
    init(achievementID: Int, achievementName: String, achievementDescription: String) {
        self.achievementID = achievementID;
        self.achievementName = achievementName;
        self.achievementDescription = achievementDescription;
        return;
    }

class AchievementDatabase {
    //Act as a local database storage until connection is made
    var numAchievements: Int = 1; //Will change to achievementArray.count();
    init(achievementArray: AchievementObject) {

        for i in 1...numAchievements {
            debugPrint("i: \(i)");
            //var achievement = AchievementObject(id:i); //
        }
    }

【问题讨论】:

    标签: ios arrays swift for-loop


    【解决方案1】:

    我认为您需要对代码进行一些更改。反正 主要问题是AchievementDatabase 得到一个AchievementObject,但实际上你需要一个数组,那么你应该使用符号[AchievementObject]

    所以你可能想要遵循这个重构:

    测试:

    var achievementArray = [AchievementObject]()
    achievementArray.append(AchievementObject(achievementID: -1, achievementName: "achievementName", achievementDescription: "achievementDescription"))
    achievementArray[0].achievementID = 1
    achievementArray[0].achievementName = "Hello World!"
    achievementArray[0].achievementName = "Be Born!"
    
    let achievementDB = AchievementDatabase(achievementArray: achievementArray)
    print(achievementDB.achievementArray.count)
    

    型号:

    class AchievementObject {
        var achievementID: Int
        var achievementName: String
        var achievementDescription: String
    
        init(achievementID: Int, achievementName: String, achievementDescription: String) {
            self.achievementID = achievementID
            self.achievementName = achievementName
            self.achievementDescription = achievementDescription
        }
    }
    
    class AchievementDatabase {
        var achievementArray: [AchievementObject]
    
        init(achievementArray: [AchievementObject]) {
            self.achievementArray = achievementArray
            achievementArray.enumerated().forEach { (index, value) in
                print("index: \(index), value: \(value.achievementName)")
            }
        }
    }
    

    观察

    1. 由于多余,请避免使用分号;
    2. AchievementDatabase 正在获取一个对象,但您应该传递一个像 [AchievementObject] 这样的数组
    3. 您可能想要使用简洁的forEach,而不是冗长的for i..n,很好的解释here
    4. 您正在访问数组的位置 1,这实际上是只有 1 个元素的数组的第二个位置,因此 -> 崩溃
    5. 无崩溃访问此类位置的最佳方法是使用achievementArray.first
    6. AchievementObject 应该是一个结构,而不是一个类。然后你甚至不需要提供初始化。
    7. 如果给定AchievementObject 的值一旦设置就不会改变,请将所有属性更改为 let from var。

    【讨论】:

    • 其他建议。 1. AchievementObject 应该是一个结构,而不是一个类。那么您甚至不需要提供init。 2. 如果给定的AchievementObject 的值一旦设置就不会改变,请将所有属性从var 更改为let。 3. numAchievements 不再需要AchievementDatabase
    【解决方案2】:

    试试

     var achievementDB =  = AchievementDatabase(achievementArray: achievementArray))
    

    【讨论】:

    • 在类中声明成就数据库和未声明类型错误时引发调用错误。
    • 这个答案对了一半。您还需要将init(achievementArray: AchievementObject) { 更改为init(achievementArray: [AchievementObject]) {。现在它需要一个数组。
    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 2017-03-04
    • 2022-12-04
    • 2013-04-12
    • 2015-09-15
    • 2011-08-29
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多