restful について API Tester アプリを作ってみました。私のモデルは、「http」のようなスキーマ プロトコル、「www.google.com」のようなホスト、「/search」のようなパス、「?q=keyword」のようなクエリ パラメータなど、いくつかのプロパティを格納しました。および URL 文字列に関する計算されたプロパティ、それは上記の保存されたプロパティから結合されました。
class ModelStore: ObservableObject {
@Published var scheme = “http”
@Published var host = ""
@Published var port = "80"
@Published var path = ""
@Published var query = ""
var urlString: String {
get {
var tempUrl: String
tempUrl = scheme + “://” + host + ":" + port + "?" + query
return tempUrl
}
set {
guard let url = URL(string: newValue) else {
return
}
scheme = url.scheme ?? ""
host = url.host ?? ""
path = url.path
query = url.query ?? ""
}
}
var parametersArray: [String] {
get {
query.components(separatedBy: "&")
}
set {
query = newValue.joined(separator: "&")
}
}
var paramStruct: [ParaStruct] {
get {
var params = [ParaStruct]()
parametersArray.forEach { (str) in
let item = str.components(separatedBy: "=")
if item.count > 1 {
params.append(ParaStruct(key: item[0], value: item[1]))
}
}
return params
}
set {
var newQuery = [String]()
newValue.forEach { (value) in
let item = value.key + "=" + value.value
newQuery.append(item)
}
query = newQuery.joined(separator: "&")
}
}
}
class ParaStruct: Identifiable, ObservableObject{
var id = UUID()
static func == (lhs: ParaStruct, rhs: ParaStruct) -> Bool {
lhs.key == rhs.key && lhs.value == rhs.value
}
@Published var key: String = ""
@Published var value: String = ""
init(key: String, value: String) {
self.key = key
self.value = value
}
}
struct ContentView: View {
@ObservedObject var modelStore = ModelStore()
var body: some View {
GeometryReader { geometryProxy in
VStack(spacing: 0) {
TextField("URL", text: self.$modelStore.urlString)
TextField("Host", text: self.$modelStore.host)
TextField("Port", text: self.$modelStore.portString)
TextField("Path", text: self.$modelStore.path)
TextField("Query Parameters", text: self.$modelStore.query)
List(self.modelStore.paramStruct) { (param) in
TextField("value", text: Binding(get: {
param.value
}, set: { (value) in
//this textfield doesn't work in here
param.value = value
}))
}
}
}
}
}
これまでのところすべて問題ありませんが、リストのテキスト フィールドが機能しません。モデルから更新を読み取ることはできますが、テキストフィールドの変更をモデルに書き込むことはできません。他のビューでは同期が変更されません。
set: { (value) in
//this textfield doesn't work in here
param.value = value
}
何が問題なの?多分私の理解が間違っている?誰か助けて?</p>