【发布时间】:2021-11-04 11:43:30
【问题描述】:
我正在尝试处理一个学校项目,但我无法理解如何获取多个特定数据集。
我有一个名为 GameView 的视图,其中有以下 FetchRequest:
FetchRequest(entity: Player.entity(), sortDescriptors: [], predicate: NSPredicate(format: "isPlaying == %@", true))
var allPlayers: FetchedResults<Player>
“玩家”是一个核心数据实体,具有firstName、lastName、Position 和isPlaying 属性
但是,我需要能够根据位置属性为特定玩家分配特定角色。例如,我想将每个具有位置属性“P”的 Player 实体分配给“Pitchers”的 @State 数组,并且我想将每个具有位置属性“SS”的 Player 实体分配给 @State 数组'游击手'。
我唯一想到的就是使用两个不同的谓词发出两个单独的提取请求,但我记得每个视图只能发出一个提取请求。我该如何解决这个问题?
这是我的一些代码。以前,我使用 Observable Object 分配位置,但我想换掉它。
struct GameView: View {
@ObservedObject var TeamNamesAndColors: TeamAttributes
// declares all the different variables necessary to represent game state
@State var GameIsOver: Bool = false
@State var ProceedToResults: Bool = false
@State var IsInningTop: Bool = true
@State var InningNumber: Int = 1
@State var CurrentBatter: [String: String] = ["FirstName": "", "LastName": "", "Position": ""]
@State var HitterIndexHome: Int = 1
@State var HitterIndexAway: Int = 1
@State var AwayPitcher: [String: String] = ["FirstName": "", "LastName": ""]
@State var HomePitcher: [String: String] = ["FirstName": "", "LastName": ""]
@State var CurrentPitcher: [String: String] = ["FirstName": "", "LastName": "", "Position": ""]
@State var BSOCount: [String: Int] = ["Balls": 0, "Strikes": 0, "Outs": 0]
@State var BasesState: [String: Bool] = ["1B": false, "2B": false, "3B": false]
@State var AwayTeamScore: Int = 0
@State var HomeTeamScore: Int = 0
// used to present different navigation buttons or Pitch Sheet
@State var showPitchView = false
@State var goBackHome = false
@State var finishEarly = false
// checks which position in the lineup is the pitcher, and assigns it the pitcher role
func SetAwayPitcher() {
if AnHDetails.Hitter1APos == "P" {
AwayPitcher["FirstName"] = AnHDetails.hitter1AFirst
AwayPitcher["LastName"] = AnHDetails.hitter1ALast
} else if AnHDetails.Hitter2APos == "P" {
AwayPitcher["FirstName"] = AnHDetails.hitter2AFirst
AwayPitcher["LastName"] = AnHDetails.hitter2ALast
} else if AnHDetails.Hitter3APos == "P" {
AwayPitcher["FirstName"] = AnHDetails.hitter3AFirst
AwayPitcher["LastName"] = AnHDetails.hitter3ALast
} else if AnHDetails.Hitter4APos == "P" {
AwayPitcher["FirstName"] = AnHDetails.hitter4AFirst
AwayPitcher["LastName"] = AnHDetails.hitter4ALast
} else if AnHDetails.Hitter5APos == "P" {
AwayPitcher["FirstName"] = AnHDetails.hitter5AFirst
AwayPitcher["LastName"] = AnHDetails.hitter5ALast
} else if AnHDetails.Hitter6APos == "P" {
AwayPitcher["FirstName"] = AnHDetails.hitter6AFirst
AwayPitcher["LastName"] = AnHDetails.hitter6ALast
} else if AnHDetails.Hitter7APos == "P" {
AwayPitcher["FirstName"] = AnHDetails.hitter7AFirst
AwayPitcher["LastName"] = AnHDetails.hitter7ALast
} else if AnHDetails.Hitter8APos == "P" {
AwayPitcher["FirstName"] = AnHDetails.hitter8AFirst
AwayPitcher["LastName"] = AnHDetails.hitter8ALast
} else if AnHDetails.Hitter9APos == "P" {
AwayPitcher["FirstName"] = AnHDetails.hitter9AFirst
AwayPitcher["LastName"] = AnHDetails.hitter9ALast
}
}
// same thing as previous func
func SetHomePitcher () {
if AnHDetails.Hitter1HPos == "P" {
HomePitcher["FirstName"] = AnHDetails.hitter1HFirst
HomePitcher["LastName"] = AnHDetails.hitter1HLast
} else if AnHDetails.Hitter2HPos == "P" {
HomePitcher["FirstName"] = AnHDetails.hitter2HFirst
HomePitcher["LastName"] = AnHDetails.hitter2HLast
} else if AnHDetails.Hitter3HPos == "P" {
HomePitcher["FirstName"] = AnHDetails.hitter3HFirst
HomePitcher["LastName"] = AnHDetails.hitter3HLast
} else if AnHDetails.Hitter4HPos == "P" {
HomePitcher["FirstName"] = AnHDetails.hitter4HFirst
HomePitcher["LastName"] = AnHDetails.hitter4HLast
} else if AnHDetails.Hitter5HPos == "P" {
HomePitcher["FirstName"] = AnHDetails.hitter5HFirst
HomePitcher["LastName"] = AnHDetails.hitter5HLast
} else if AnHDetails.Hitter6HPos == "P" {
HomePitcher["FirstName"] = AnHDetails.hitter6HFirst
HomePitcher["LastName"] = AnHDetails.hitter6HLast
} else if AnHDetails.Hitter7HPos == "P" {
HomePitcher["FirstName"] = AnHDetails.hitter7HFirst
HomePitcher["LastName"] = AnHDetails.hitter7HLast
} else if AnHDetails.Hitter8HPos == "P" {
HomePitcher["FirstName"] = AnHDetails.hitter8HFirst
HomePitcher["LastName"] = AnHDetails.hitter8HLast
} else if AnHDetails.Hitter9HPos == "P" {
HomePitcher["FirstName"] = AnHDetails.hitter9HFirst
HomePitcher["LastName"] = AnHDetails.hitter9HLast
}
}
// decides batter's position and initializes CurrentBatter
func SetFirstHitter() {
CurrentBatter["FirstName"] = AnHDetails.hitter1AFirst
CurrentBatter["LastName"] = AnHDetails.hitter1ALast
CurrentBatter["Position"] = AnHDetails.Hitter1APos
}
// sets the HomePitcher to be the active pitcher to begin the game
func SetFirstPitcher() {
CurrentPitcher["FirstName"] = HomePitcher["FirstName"]
CurrentPitcher["LastName"] = HomePitcher["LastName"]
}
【问题讨论】:
-
我们需要一些代码来解决这个问题,但通常情况下,您无需将 CoreData 属性放入单独的数组中即可随意使用。
-
哦,好吧。否则我将如何识别它们?获取结果后,如何访问某些特定的结果?
-
.filter是一种方式。 -
我很困惑。假设我有以下内容: func SetFirstHitter() { CurrentBatter["FirstName"] = CurrentBatter["LastName"] = CurrentBatter["Position"] = }我会这样做吗?
-
我最初避免这样做是因为您使用的是 CoreData,但请参阅:How do I ask a good question? 和 How to create a Minimal, Reproducible Example。您发布的代码的问题只是它是一组用于过滤某些玩家的蛮力函数。但是,回答您的问题所需的代码是
var body代码,它显示了您希望如何使用它。您是在修改属性还是仅显示它们?我们无法以这种方式帮助您。