web-dev-qa-db-fra.com

Impossible d'appeler 'valeur' ​​avec une liste d'arguments de type '(String)'

Je suis un débutant chez Swift et je migre une application vers Swift 3.0

Je continue à avoir cette erreur et je ne sais pas comment le résoudre.

"Impossible d'appeler 'valeur' ​​avec une liste d'arguments de type '(String)'"

Il est affiché à presque chaque ligne de cet extrait. Avez-vous une idée d'où cela pourrait provenir? Merci beaucoup

        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

            }

        }

Comme demandé, voici plus d'informations sur les messages

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

Voici encore plus d'informations

        // 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
    }
4
Quentin Del

Vous devrez probablement les changer en (message as AnyObject).value(forKey:"···") (en ajoutant l'étiquette forKey:).

Savez-vous quel type d'objet message est censé être? Le lancer à plusieurs reprises dans AnyObject est étrange. Il serait plus propre de créer une nouvelle variable - let messageObject = message as AnyObject puis d'appeler messageObject.value(forKey:"···"). (Je suppose que vous voulez vraiment le transtyper en Dictionary ou quelque chose du genre, auquel cas vous pouvez faire messageDictionary["···"] au lieu d'appeler value(forKey:).)

En outre, dans Swift, vous pouvez le faire pour réduire davantage la redondance:

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

Si message est un dictionnaire json, convertissez-le en [String:Any] et utilisez ensuite indice avec celui-ci.

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

OU

Si message est du type Messages, vous pouvez accéder directement à sa propriété à l'aide de message.content. De la même manière, vous pouvez également accéder à d'autres propriétés.

stringContent = message.content
1
Nirav D