【问题标题】:Issue with storing data within an Array - Swift在数组中存储数据的问题 - Swift
【发布时间】:2018-09-25 12:13:25
【问题描述】:

我目前的设置如下:

我在 Firebase 中运行查询以提取一系列类型中的所有类型,如下所示:

var genresLabelIndex : [String] = ["Horror", "Fiction", "Romance"]

然后我为每个类型创建一个空白数组,以便能够在每个区域内存储类型的信息,如下所示:

var horrorData = [InformationForFeed]()
var fictionData = [InformationForFeed]()
var romanceData = [InformationForFeed]()

InformationForFeed 看起来像这样:

class InformationForFeed {


    fileprivate var _uploadKey:String!
    fileprivate var _userKey:String!
    fileprivate var _imageURL:String!
    fileprivate var _socialMedia:[String]



    var uploadKey:String!{
        return _uploadKey
    }
    var userKey:String!{
        return _userKey
    }
    var imageURL:String!{
        return _imageURL
    }


    init(dictionary:Dictionary<String,AnyObject>, socials: [String]) {

        _socialMedia = socials

        if let uploadKey = dictionary["upload_key"] as? String {
            self._uploadKey = uploadKey
        }
        if let userKey = dictionary["user_key"] as? String {
            self._userKey = userKey
        }
        if let imageURL = dictionary["imageUrl"] as? String {
            self._imageURL = imageURL
        }
    }
}

然后我创建一个流派数组列表的数组,如下所示:

1) 首先我创建一个空数组,如下所示:

var genreArrayIndex : [[InformationForFeed]] = []

2) 然后在 UIView 的 init() 中设置数组中的内容,如下所示:

genreArrayIndex = [self.horrorData, self.fictionData, self.romanceData]

然后我将运行一个名为 getData() 的函数,它将运行我的查询并开始存储信息。

我将每种类型的信息存储在tempArray 中,然后我将genreArrayIndex[index] 设置为等于tempArray,然后清除tempArray,如下面的getData 所示。

func getData() {

    for genre in genresLabelIndex {
        let dbReference = Database.database().reference().child("genres").child(genre)
        let query = dbReference.queryLimited(toLast: 6)


        query.observeSingleEvent(of: .value, with: { (snapshot : DataSnapshot) in

            if snapshot.childrenCount > 0 {

                for s in snapshot.children.allObjects as! [DataSnapshot] {

                    let item = s.value as! Dictionary<String,AnyObject?>
                    let facebook = (s.childSnapshot(forPath: "social_links").value as? NSDictionary)?["facebook_link"]
                    let audible = (s.childSnapshot(forPath: "social_links").value as? NSDictionary)?["audible_link"]
                    let amazon = (s.childSnapshot(forPath: "social_links").value as? NSDictionary)?["amazon_link"]

                    var socialsArray = [String]()

                    if facebook != nil {
                        socialsArray.append(facebook! as! String)
                    } else {
                        socialsArray.append("nil")
                    }

                    if audible != nil {
                        socialsArray.append(audible! as! String)
                    } else {
                        socialsArray.append("nil")
                    }

                    if amazon != nil {
                        socialsArray.append(amazon! as! String)
                    } else {
                        socialsArray.append("nil")
                    }

                    let data = InformationForFeed(dictionary: item as Dictionary<String,AnyObject>, socials: socialsArray)

                        self.newArray.append(data)
                }


            }


            self.genreArrayIndex[self.genreArrayIndexCount] = self.newArray
            self.genreArrayIndexCount = self.genreArrayIndexCount + 1
            self.newArray.removeAll()

            self.internalIndex = self.internalIndex + 1
            if self.internalIndex == self.genresLabelIndex.count {
                self.tableView.reloadData()
            }


        })

    }

}

我的tempArray 看起来像这样: var newArray = [InformationForFeed]()

index 看起来像这样:

var genreArrayIndexCount : Int = 0

现在问题来了....

所有信息都正确存储在genreArrayIndex 中......但是......它实际上并未将信息存储在存储在genreArrayIndex 中的数组中。

所以换句话说,如果你要print(self.genreArrayIndex),它将被完全填充。但如果你要print(self.fictionData),它将是空白的。

我该如何解决这个问题?

【问题讨论】:

    标签: arrays swift database swift3 swift4


    【解决方案1】:

    数组是一种值类型。这意味着它的内容是副本。用空的horrorData(和其他)初始化genreArrayIndex,然后用getData() 填充它不会也将数据复制回horrorData。我会建议消除

    genreArrayIndex = [self.horrorData, self.fictionData, self.romanceData]
    

    并用计算属性替换 horrorData, fictionData, ...。也许是这样。

    var horrorData: [InformationFeed] {
       return genreArrayIndex[0]
    }
    

    【讨论】:

    • 这会导致Instance genreArrayIndex cannot be used on type UIView (Name of the UIView)的错误
    • 我已经通过 get { return genreArrayIndex[0] } 在每个数组变量中将genreArrayIndex设置为 = [[],[],[]] 解决了这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2020-03-06
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多