不能在不可变值上使用变异成员:函数调用返回不可变值 - 不确定为什么值是不可变的

时间:2018-01-16 18:38:37

标签: arrays swift

Swift开发相对较新。试图修改别人写的几个函数。目标是在用户登录后首次调用此路径(该部分尚未设置),并在后续呼叫中使用另一个路径。

因此,在编写将指向第一次或非第一次传递的逻辑之前,我正在测试非第一次传递逻辑。

这是allOfferCards():

func allOfferCards() -> [OfferCard]{

    guard dataSource != nil else {
        return []
    }

    let numberOfCards = self.dataSource!.kolodaNumberOfCards(self)

    var offerCards = [OfferCard]()

    for i in 0..<numberOfCards {
        let offerCard = viewForCard(at: i)

        if let offerCard = offerCard {
            offerCards.append(offerCard as! OfferCard)
        }

    }

    return offerCards
}

这是我尝试进行更改的地方。原始逻辑反转allOfferCards()的返回。我想使用一个名为“shuffle”的自定义函数来随机化数组。

func displayOfferCards() -> Void {
    // What was here originally
    //let offerCards = allOfferCards().reversed()
    var offerCards = allOfferCards().shuffle()

    for (index, offerCard) in offerCards.enumerated() {
        let delay = Double(index) * 0.2
        offerCard.display(delay: delay)
    }
}

这是随机播放功能

extension Array
{
    /** Randomizes the order of an array's elements. */
    mutating func shuffle()
    {
        for _ in 0..<10
        {
            sort { (_,_) in arc4random() < arc4random() }
        }
    }
}

然而,当我尝试运行它时,我在标题中得到错误 - 不能在不可变值上使用变异成员。但是我不确定为什么allOfferCards()生成一个不可变值 - var provideCards是使用var关键字定义的,而不是let关键字 - 这应该意味着它是可变的正确吗?

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

问题是在赋值函数的返回值之前,值本身是不可变的,因此无法直接调用它上面的变异函数。您应该首先将返回值赋给一个可变变量,然后在其上调用mutating函数。

func displayOfferCards() -> Void {
    var offerCards = allOfferCards()
    offerCards.shuffle()

    for (index, offerCard) in offerCards.enumerated() {
        let delay = Double(index) * 0.2
        offerCard.display(delay: delay)
    }
}

答案 1 :(得分:0)

补充@Dávid Pásztor answer

您可以使用返回混合副本(shuffle())的变量,而不是使用变异函数(shuffled()),类似于sort() vs sorted()。由于没有变量被变异,所以它都可以在线完成:

func displayOfferCards() {
    for (index, offerCard) in allOfferCards().shuffled().enumerated() {
        offerCard.display(delay: Double(index) * 0.2)
    }
}

有关shuffle()shuffled()

的实施,请参见this answer