【问题标题】:No exact matches in call to instance method 'append' : Swift调用实例方法 \'append\' 没有完全匹配:Swift
【发布时间】:2022-11-09 22:35:56
【问题描述】:

所以我试图从firebase获取值到一个表中。因此,首先我将数据项添加到类型 [Dictionary] 的列表中

数据是这样的:

Posts:
    P1 :
        post data....
    P2:
        post data....

我正在使用的代码

let Posts: [Dictionary<String,Any>]! = nil
var dict = Postsnapshot?.value as? Dictionary<String, Dictionary<String, Any>>
Posts.append(contentsOf: dict.values)

我正在做这样的事情,但它抛出了这个错误“在调用实例方法'append'时没有完全匹配”。我已经尝试了每个初始化程序,甚至 list.append(Dict) ,仍然是同样的错误。我应该怎么办 ?

【问题讨论】:

  • 用大写 P 调用变量Posts 是令人厌恶的。不要这样做。

标签: ios arrays swift firebase


【解决方案1】:

您正在使用大写字母调用数组Posts,并且您可能在某处声明了一个具有相同名称的类型,并且编译器感到困惑。当然,您还需要使 posts 成为 var 才能添加一些内容,因为 let 使其不可变。

编写此代码的更清洁和正确的方法是:

var posts: [Dictionary<String,Any>] = []
let dict = postsnapshot?.value as? Dictionary<String, Dictionary<String, Any>>
posts.append(contentsOf: Array(dict?.values ?? []))

另外请将Postsnapshot 属性重命名为postsnapshot,除非您实际上是在Postsnapshot 类型上调用静态属性。

以下是一些学习如何设计 Swift 代码样式的资源:

但是要了解有关如何最有效地使用 Swift 的更多信息,我会强烈建议看一下官方Swift Language Guide,最好阅读全文。这是令人难以置信的信息!

【讨论】:

  • 用大写字母声明变量会导致问题还是有所不同?我的意思是它只是一个变量的问题是什么?
  • 顺便说一句谢谢。还有其他问题,你的帖子也帮助了我。
  • 我不会自己引起问题,但是对于阅读您的代码的人来说,这是非常令人困惑的,因为命名属性的标准(不是官方的,但每个人都遵守)方法是使用Camel Case,首字母小写。在命名类、结构、参与者和协议等类型时,只能以大写字母开头。
  • @ManuBalyan 很高兴为您提供帮助,如果这对您有所帮助,我将不胜感激!
【解决方案2】:

使用循环在数组中一一追加值

例如。

var 帖子:[Dictionary<String,Any>]! = 无

var dict = Postsnapshot?.value as?字典<String, Dictionary<String, Any>>

对于 dict.values 中的 val {

Posts.append(val)

}

【讨论】:

    【解决方案3】:

    我发布此答案以防万一像我这样的人在问题不是真正与 append 方法本身有关而是与传递给 append 方法有关的问题时遇到此问题。

    就我而言,我尝试将新创建的结构实例附加到所述结构的数组中。我应该提供给结构的初始化程序的参数之一是字符串。我顺便传入了一个枚举而不是枚举的rawValue。由于我在同一行中创建对象并初始化结构,因此 Xcode 出于某种原因向我显示了问题中提到的错误。

    private var items: [Item] = []
    
    func addItem(name: String, currency: Currency){ 
      items.append(
        Item(
          name: name, 
          currency: currency
        )
      )
    }
    

    参数是货币。

    我必须先将结构的初始化与添加到数组中的内容分开,方法是先分配一个变量,然后将该变量附加到数组中,然后才能得到正确的错误消息。在我解决了这个问题之后,我又把它变成了一个单线。

    let item = Item(
        name: name, 
        currency: currency
      )
    items.append(item)
    

    【讨论】:

      【解决方案4】:

      在声明过程中,我已经声明了它不允许我附加值的“let”变量。

      我已将其更改为“var”,目前似乎正在工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-16
        • 2021-12-14
        • 2022-09-28
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多