Как я понимаю, один из способов сделать это - использовать JSON. Но было бы проще и проще просто отправить быстрый объект на сервер, чтобы сервер имел тот же доступный класс. Таким образом, я могу просто использовать быстрый шаг на каждом шагу.Можно обменивать объекты между приложением Swift и бэкэнд?
Возможно ли это, и как я могу это сделать?
Текущая установка:
- Swift площадка для передачи данных.
- Kitura сервер для приема данных.
код Детская площадка:
import UIKit
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
struct TestObject {
let foo = "just a string"
let number = 125
let array = ["bar", "foo"]
func printSomeInfo() {
print(foo + "\(number+25)")
}
}
func send() {
let request = NSMutableURLRequest(url: URL(string: "http://192.168.178.80:8090/test")!)
request.httpMethod = "POST"
let testObject = TestObject()
let bodyData = "\(testObject)"
request.httpBody = bodyData.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request as URLRequest,
completionHandler: {
(data, response, error) -> Void in
})
task.resume()
}
send()
Kitura код main.swift:
import Kitura
import Foundation
let router = Router()
struct TestObject {
let foo = "just a string"
let number = 125
let array = ["bar", "foo"]
func printSomeInfo() {
print(foo + "\(number+25)")
}
}
router.post("/test") {request, response, next in
response.headers["Content-Type"] = "text/plain; charset=utf-8"
if let post = try request.readString() {
// would like to cast to TestObject but that doesn't work
// let postObject = post as TestObject
print(post)
}
}
Kitura.addHTTPServer(onPort: 8090, with: router)
Kitura.run()
Вам нужно каким-то образом закодировать объект, чтобы отправить его по сети, даже если у вас есть Swift с обеих сторон, так как вы не можете просто отправить кусок памяти. Если вы не хотите использовать JSON, буферы протокола - это опция, но поддержка Swift еще рано; https://github.com/apple/swift-protobuf – Paulw11
Возможно, мне не хватает понимания уровня объектов, но не существует способа передать состояние объекта, а затем сохранить его как объект снова на сервере? Когда я отправляю объект в виде строки, сервер печатает: TestObject (foo: «просто строка», число: 125, array: ["bar", "foo"]) Не удалось восстановить объект из этого информация на стороне сервера? – Jeffrey
Вы не можете просто отправлять сырые байты по сети - заданный набор байтов может быть строкой или целым значением или ссылкой на объект, и это последнее особенно сложно, так как адреса памяти будут совершенно разными на разных устройствах; поэтому вам нужно использовать какой-то формат для сериализации информации, чтобы два конца могли четко общаться. В вашем примере кода вы используете метод 'description' для« отправки »вашего тестового объекта, и, хотя это« встроенный », нет встроенного способа анализа этого объекта обратно и никакого стандарта для того, что« описание » возвращается. – Paulw11