调用初始化程序没有完全匹配 - Swift 2D 数组

Posted

技术标签:

【中文标题】调用初始化程序没有完全匹配 - Swift 2D 数组【英文标题】:No exact matches in call to initializer - Swift 2D array 【发布时间】:2021-04-23 21:22:14 【问题描述】:

出现问题时,我正在创建简单的测验应用程序。

我有一个到 UILabel 的 IBOutlet 连接:

@IBOutlet weak var questionText: UILabel!

还有问题和正确答案:

let questions = [["1 + 1 = 2", true],
                     ["2 + 2 * 2 = 8", false],
                     ["It's third question", true]]

"Cannot assign value of type 'Any' to type 'String'" 错误,当更改问题时:

func nextQuestion(num: Int)
        questionNum += 1
        questionText.text = questions[num][0] // <- error is here
    

当我尝试强制字符串时,"no exact matches in call to initializer" 出现了,即使我说这是一个字符串并且没有理由计算它: questionText.text = String(questions[num][0])

唯一有效的代码是:

questionText.text = questions[num][0] as? String

我打扰为什么?我不明白为什么 String() 是错误的并且 as! 会产生警告 “将强制向下转换为 'String' 作为可选将永远不会产生 'nil' "

questionText.text = questions[num][0] as! String

【问题讨论】:

【参考方案1】:

根据您的声明,questions 的类型是[[Any]],这导致了您所描述的错误。

最好以类型安全的方式做事。

    let questions = [
        ("1 + 1 = 2", true),
        ("2 + 2 * 2 = 8", false),
        ("It's third question", true)
    ]

    func nextQuestion(num: Int)
        questionNum += 1
        questionText.text = questions[num].0
    

或者为questions的元素定义一个结构会是更可取的方式。

【讨论】:

【参考方案2】:

根据有关使用结构的建议,我设法在我的项目中创建了一个新文件,我在其中定义了问题结构。

struct Question
    let title: String
    let answer: Bool
    
    init(title: String, answer: Bool)
        self.title = title
        self.answer = answer
    

然后我就可以像上面那样创建问题了。

let questions = [
        Question(title: "1 + 1 = 2", answer: true),
        Question(title: "2 + 2 * 2 = 8", answer: false),
        Question(title: "It's third question", answer: true)
    ]
questions[questionNum].title
questions[questionNum].answer

【讨论】:

以上是关于调用初始化程序没有完全匹配 - Swift 2D 数组的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中调用实例方法错误消息没有完全匹配

使用格式参数时,Swift 中的字符串初始值设定项问题

无法为没有参数的“URL”类型调用初始化程序 - Swift 3

iOS Swift 可解码:错误:无法为没有参数的类型调用初始化程序

json.swift 错误是 Self.init 在委托初始化程序中的所有路径上都没有调用

Swift数组初始化程序语法类型不匹配