无法将类型为'<Int>'的值转换为预期的元素类型<Any>。

时间:2021-08-12 04:13:56

标签: swift generics types swiftui swift3

我正在尝试学习 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, ...],但看起来似乎不行。

任何人有什么关于这个问题的线索吗?

1 个答案:

答案 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))]
}