gpt4 book ai didi

ios - 如何动态选择结构的属性作为参数传递给 swift 4 中的函数?

转载 作者:可可西里 更新时间:2023-11-01 00:27:14 28 4
gpt4 key购买 nike

我正在尝试减少我编写的函数中的行数。为了实现这一点,我需要根据某些条件选择结构的属性并将该属性作为参数传递,以便将该属性与数组中具有相同结构类型的其他元素进行比较。这是我的巨大代码,其中为不同的属性重复了相同的事情。

我试过下面的代码。虽然它很有魅力,但我觉得同样的工作已经完成了很多次。

func checkContentsForMatching(forIndex: Int) {
var cards = [SetCard]()
for index in game.indicesOfChosenCards.indices {
cards.append(cardTitles[testCards[game.indicesofChosenCards[index]]]!)


}

if (cards[0].color == cards[1].color) && (cards[1].color == cards[2].color) && (cards[0].color == cards[2].color) {
game.playingCards[game.indicesOfChosenCards[0]].color = true
game.playingCards[game.indicesOfChosenCards[1]].color = true
game.playingCards[game.indicesOfChosenCards[2]].color = true

}
else if cards[0].color == cards[1].color {
game.playingCards[game.indicesOfChosenCards[0]].color = true
game.playingCards[game.indicesOfChosenCards[1]].color = true

}
else if cards[1].color == cards[2].color {
game.playingCards[game.indicesOfChosenCards[1]].color = true
game.playingCards[game.indicesOfChosenCards[2]].color = true

}
else if cards[0].color == cards[2].color {
game.playingCards[game.indicesOfChosenCards[0]].color = true
game.playingCards[game.indicesOfChosenCards[2]].color = true
}

if (cards[0].shape == cards[1].shape) && (cards[1].shape == cards[2].shape) && (cards[0].shape == cards[2].shape) {
game.playingCards[game.indicesOfChosenCards[0]].shape = true
game.playingCards[game.indicesOfChosenCards[1]].shape = true
game.playingCards[game.indicesOfChosenCards[2]].shape = true
}
else if cards[0].shape == cards[1].shape {
game.playingCards[game.indicesOfChosenCards[0]].shape = true
game.playingCards[game.indicesOfChosenCards[1]].shape = true
}
else if cards[1].shape == cards[2].shape {
game.playingCards[game.indicesOfChosenCards[1]].shape = true
game.playingCards[game.indicesOfChosenCards[2]].shape = true
}
else if cards[0].shape == cards[2].shape {
game.playingCards[game.indicesOfChosenCards[0]].shape = true
game.playingCards[game.indicesOfChosenCards[2]].shape = true
}

最佳答案

你要找的是 Swift KeyPath .

在我的 Sets 实现 (Zotz!)​​ 中,这就是我所做的。首先,我对四个卡片属性使用具有 Int 原始值的枚举。这使我可以将任何属性表示为通用类型 (Int)。我将这些原始值表示为计算属性,并将所有四个计算属性的列表作为键路径数组提供(注意,这是 Swift 5):

public struct Card: Codable, CustomStringConvertible {

let itsColor : Color
let itsNumber : Number
let itsShape : Shape
let itsFill : Fill

var itsColorRaw : Int { return itsColor.rawValue }
var itsNumberRaw : Int { return itsNumber.rawValue }
var itsShapeRaw : Int { return itsShape.rawValue }
var itsFillRaw : Int { return itsFill.rawValue }
public static let attributes : [KeyPath<Card, Int>] = [
\itsColorRaw, \itsNumberRaw, \itsShapeRaw, \itsFillRaw
]
// ...
}

好的,现在给定的三张牌是否构成有效匹配的规则很容易表达:

private func isCorrectCards(_ cards:[Card]) -> Bool {
func evaluateOneAttribute(_ nn:[Int]) -> Bool {
let allSame = (nn[0] == nn[1]) && (nn[1] == nn[2])
let allDiff = (nn[0] != nn[1]) && (nn[1] != nn[2]) && (nn[2] != nn[0])
return allSame || allDiff
}
return Card.attributes.allSatisfy { att in
evaluateOneAttribute(cards.map{$0[keyPath:att]})
}
}

@vacawama 建议的更优雅的版本:

private func isCorrect(cards:[Card]) -> Bool {
return Card.attributes.allSatisfy { att in
Set(cards.map{$0[keyPath:att]}).count != 2
}
}

关于ios - 如何动态选择结构的属性作为参数传递给 swift 4 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55797314/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com