我正在尝试学习 Swift,但是我有一个问题,使用 Java 中的 可能会解决我的问题,我认为这样做可以解决我的问题。Apple 文档说我应该使用 ,但我一直得到错误。
我正在尝试构建一个记忆卡片游戏,我有以下模型:
import Foundation
import UIKit
struct Theme<Type> {
internal init(name: String, emojis: [Type], numberOfPairs: Int, cardsColor: UIColor) {
self.name = name
self.emojis = emojis
if(numberOfPairs > emojis.count || numberOfPairs < emojis.count) {
fatalError("数组越界")
}
self.numberOfPairs = numberOfPairs
self.cardsColor = cardsColor
}
var name: String
var emojis: [Type]
var numberOfPairs: Int
var cardsColor: UIColor
}
我还有一个 Game 模型来处理游戏逻辑和卡牌模型,我还需要实现很多东西,但是这里是代码:
import Foundation
struct Game {
var themes: [Theme<Any>]
var cards: [Card<Any>]
var score = 0
var isGameOver = false
var choosenTheme: Theme<Any>
init(themes: [Theme<Any>]) {
self.themes = themes
self.choosenTheme = self.themes.randomElement()!
cards = []
for index in 0..\<choosenTheme.numberOfPairs {
cards.append(Card(id: index*2, content: choosenTheme.emojis[index]))
cards.append(Card(id: index*2+1, content: chosenTheme.emojis[index]))
}
}
mutating func endGame() {
isGameOver = true
}
mutating func penalizePoints() {
score -= 1
}
mutating func awardPoints () {
score += 2
}
struct Card<T>: Identifiable {
var id: Int
var isFaceUP: Bool = false
var content: T
var isMatchedUP: Bool = false
var isPreviouslySeen = false
}
}
正如您所注意到的,我已经使用 Any 类型来创建一个卡牌和主题的数组,因为它们可以具有字符串、数字或图像。
在我的 ViewModel 中,我有以下代码,其中我正在尝试将两个主题(一个是字符串类型的内容,另一个是 Int)添加到主题数组中:
import Foundation
import SwiftUI
class GameViewModel {
static let halloweenTheme = Theme<Int>(name: "WeirdNumbers", emojis: [1, 2, 4, 9, 20, 30], numberOfPairs: 6, cardsColor: .darkGray)
static let emojisTheme = Theme<String>(name: "Faces", emojis: ["", "", "", "", "", "", "", ""], numberOfPairs: 5, cardsColor: .blue)
var gameController: Game = Game(themes: [halloweenTheme, emojisTheme])
}
但是我一直得到这个或类似的错误:
Cannot convert value of type 'Theme' to expected element type 'Array<Theme>.ArrayLiteralElement' (aka 'Theme') 'Cannot convert value of type 'Theme' to expected element type 'Array<Theme>.ArrayLiteralElement' (aka 'Theme')
我的头脑正在疯狂,我认为通过使用 [Theme] 我可以拥有这样的数组:[Theme, Theme, Theme, ...],但看起来似乎不行。
任何人有什么关于这个问题的线索吗?
答案 0 :(得分:0)
你可以使用包装器结构体,基本示例如下。注意:如果需要符合 Codable,则需要自行实现 encode / decode。
struct Values<A> {
let value: A
}
struct Wrapper {
let wrappedValue: Values<Any>
}
class MyClass {
var wrappedValues: [Wrapper] = [Wrapper(wrappedValue: Values(value: "hello")), Wrapper(wrappedValue: Values(value: 1))]
}