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关键字 - 这应该意味着它是可变的正确吗?
我在这里做错了什么?
答案 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)
您可以使用返回混合副本(shuffle()
)的变量,而不是使用变异函数(shuffled()
),类似于sort()
vs sorted()
。由于没有变量被变异,所以它都可以在线完成:
func displayOfferCards() {
for (index, offerCard) in allOfferCards().shuffled().enumerated() {
offerCard.display(delay: Double(index) * 0.2)
}
}
有关shuffle()
,shuffled()
。