【问题标题】:Cannot invoke 'value' with an argument list of type '(String)'无法使用“(字符串)”类型的参数列表调用“值”
【发布时间】:2017-02-07 16:13:58
【问题描述】:

我是 Swift 的初学者,我正在将应用程序迁移到 Swift 3.0

我一直有这个错误,我不知道如何解决它。

"不能使用类型为 '(String)' 的参数列表调用 'value'"

它几乎显示在这个 sn-p 的每一行。 你知道它可能来自哪里吗? 非常感谢

        if ((message as AnyObject).value("content") != nil){
            stringContent  = (message as AnyObject).value("content") as? String
        }

        if ((message as AnyObject).value("sender_uuid") != nil){
            stringSenderUuid  = (message as AnyObject).value("sender_uuid") as? String
        }

        if ((message as AnyObject).value("recipient_uuid") != nil){
            stringRecipientUuid  = (message as AnyObject).value("recipient_uuid") as! String
        }

        if ((message as AnyObject).value("date") != nil){

            if let result_number = (message as AnyObject).value("date") as? NSNumber
            {
                stringDate = "\(result_number)"
            }
            else   {

                stringDate  = (message as AnyObject).value("date") as! String

            }

        }

此处要求提供有关消息的更多信息

class Messages: Object {

dynamic var channel_name = ""
dynamic var content = ""
dynamic var sender_uuid = ""
dynamic var recipient_uuid = ""
dynamic var date = ""
dynamic var message_uuid = ""


override class func primaryKey() -> String? {
    return "message_uuid"
}    }



    let message = Messages()
    message.channel_name=channel_name
    message.content=stringContent
    message.sender_uuid = stringSenderUuid
    message.recipient_uuid = stringRecipientUuid
    message.date = stringDate
    message.message_uuid = stringUuid

这里有更多信息

        // initialize with nothing
    var stringContent = " "
    var stringSenderUuid = " "
    var stringRecipientUuid = " "
    var stringDate = " "
    var stringUuid = " "


    // We check for existence in the dictionnary
    if (message["content"] != nil){
         stringContent  = message["content"] as! String
    }

    if (message["sender_uuid"] != nil){
         stringSenderUuid  = message["sender_uuid"] as! String
    }

    if (message["recipient_uuid"] != nil){
         stringRecipientUuid  = message["recipient_uuid"] as! String
    }

    if (message["date"] != nil){
        if let result_number = message.value(forKey: "date") as? NSNumber
        {
            stringDate = "\(result_number)"
        }
        else   {

            stringDate  = message.value(forKey: "date") as! String

        }
    }
    if (message["uuid"] != nil){
         stringUuid  = message["uuid"] as! String
    }

【问题讨论】:

  • message 是什么,为什么要将其转换为 AnyObject
  • 我提供了有关消息的更多信息。我不确定为什么它被转换为 Anyobject :/

标签: swift swift3 migration


【解决方案1】:

您可能需要将它们更改为(message as AnyObject).value(forKey:"···")(添加forKey: 标签)。

你知道message应该是什么类型的对象吗?反复将其转换为 AnyObject 很奇怪。创建一个新变量 - let messageObject = message as AnyObject 然后调用 messageObject.value(forKey:"···") 会更简洁。 (我怀疑你真的想把它转换成Dictionary 或类似的东西,在这种情况下你可以做messageDictionary["···"] 而不是调用value(forKey:)。)

此外,在 Swift 中,您可以这样做以进一步减少冗余:

if let content = messageObject.value(forKey:"content") as? String {
  stringContent = content
}

【讨论】:

  • 添加“forKey”解决了这个问题。
【解决方案2】:

如果message 是json 字典,则将其转换为[String:Any],然后对其使用下标。

if let dic = message as? [String:Any] {
    stringContent = dic["content"] as? String ?? ""
}

如果messageMessages 的类型,那么您可以使用message.content 直接访问其属性,同样您也可以访问其他属性。

stringContent = message.content

【讨论】:

  • 当我尝试 if ((message.content != nil){ stringContent = ((message as AnyObject).value(forKey:"content") as? String)! } 它说 Value of type 'NSFastEnumerationIterator.Element' (aka 'Any') 没有成员 'content' 并建议更改为 if (((message as AnyObject).content != nil)
  • @QuentinDel 你需要展示你是如何在message 中获得价值的,这意味着你如何初始化message 这会给我们带来想法。
  • 我已经更新了我的帖子,提供了有关消息的更多信息。这个问题现在已经解决了,但我总是渴望学习如何编写更好的代码。非常感谢您的帮助。
  • @QuentinDel 你还是不明白我要问的是你在这里使用的变量message (message as AnyObject).value("content") != nil)。我在问那个消息变量你是如何初始化它的,你没有添加那个代码。如果它是字典,则下标将起作用,无需将其类型转换为 Anyobject,也无需使用valueForKey
【解决方案3】:

如果您在测试中遇到此错误(例如使用LLReactiveMatchers'ssendValues()),请尝试使您的类型(结构/类)符合Equatable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多