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
}
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
}
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