Обновление количества ключей объекта путем добавления строки

#swift #watchkit

#swift #watchkit

Вопрос:

WatchKit имеет метод presenter, который представляет QuickReplyButton с заранее определенными текстовыми ответами, и эти ответы могут быть отправлены элементу пользовательского интерфейса, такому как метка в ячейке / строке.

Я вставил строку в последнюю позицию, однако каждый последующий вызов вставляет новый ответ выше предыдущего ответа, а не ниже.

Я попытался добавить выбор выбора текста в конец массива сообщений модели чата, используя self.chats.append(text as AnyObject) , но выбор представляет собой строку, и я не могу добавить строку в массив модели чата. Value of type 'String' does not conform to 'AnyObject' . Если я полностью опущу self.chats.append(text as AnyObject) , это будет работать, как показано.

ChatDetailController

 // ...
// start of @IBAction
// ...

    self.chats.append(text as AnyObject) // how do I write this?
    let newIndex = self.chats.count - 1
    //...

    })
  

Модель

 public struct ChatModel: Codable {
    public var message: String
    // more properties

    enum CodingKeys: String, CodingKey {
        case message = "messageText"
        // more properties
    }

    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.message = try container.decode(String.self, forKey: .message)
        // more properties
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(self.message, forKey: .message)
        // more properties
    }

}
  

json

 [
  {
    "fromId": "wx1234skjksmsjdfwe234",
    "toId": "wx43922sdkfjsfmmxdfmx",
    "messageText": "Have you hopped on the bus Gus?",
    "imageUrl": "https://i.imgur.com/PJcyle7.jpg",
    "read": "true"
  },

// more objects.

]
  

Ответ №1:

Я обновил вашу ChatModel. Используйте эту структуру модели. Вы можете выполнить инициализацию из json decoder или из ваших значений времени выполнения.

 public struct ChatModel: Codable {
public var message: String
public var fromId: String
public var toId: String
public var imageUrl: URL?

enum CodingKeys: String, CodingKey {
    case message = "messageText"
    case fromId = "fromId"
    case toId = "toId"
    case imageUrl = "imageUrl"
    //case read = "read"
}

init (message:String , fromId:String, toID : String, imgUrl : URL?) {
    self.message = message
    self.fromId = fromId
    self.toId = toID
    self.imageUrl = imgUrl
}

public init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    self.message = try container.decode(String.self, forKey: .message)
    self.fromId = try container.decode(String.self, forKey: .fromId)
    self.toId = try container.decode(String.self, forKey: .toId)
    self.imageUrl = try container.decode(URL.self, forKey: .imageUrl)
    //self.read = try container.decode(Bool.self, forKey: .read)
}

public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(self.message, forKey: .message)
    try container.encode(self.fromId, forKey: .fromId)
    try container.encode(self.toId, forKey: .toId)
    try container.encode(self.imageUrl, forKey: .imageUrl)
    //try container.encode(self.read, forKey: .read)
}

}
  

И вот как вы можете создать объект chatModel для вставки в массив chats

Примечание: Используйте те же fromID и ToID, которые вы получили из json

     let newChat = ChatModel(message: "test", fromId: "fromID", toID: "tOID", imgUrl: nil)
    self.chats.append(newChat)
  

Теперь вставьте строку в таблицу в конце

Комментарии:

1. Спасибо. У меня есть несколько вопросов. 1 Почему любая строка работает в ChatModel(message: "any string works here." . **2 ** Итак, когда используется presentInputText Controller , выбор choice становится новым значением ключа сообщения структуры?

2. Пожалуйста, не меняйте содержание вопроса (заголовок), поскольку это может создать проблему в понимании кого-то другого. В этом контексте я ответил, что вам нужно добавить новую строку с соответствующим объектом chat. И это помогло вам. Свои следующие вопросы вы можете задать в новой теме.

3. Заголовок теперь более понятен. Updating the count of an object's keys by appending a string . Ваш ответ помогает мне получить к нему доступ self.chats и добавить к нему. Добавление затем обновляет количество . Это более явно, чем предыдущее название. Это тот же вопрос. Я также обрезал содержимое, потому что остальное не нужно. Если хотите, я могу изменить название для вас. Вы хотите, чтобы я это отредактировал?