我正在使用 Firebase 数据库,并且正在尝试使用NSObject. 我NSUnknownKeyException在运行应用程序时收到错误,导致它崩溃。
NSObject:
class WatchList: NSObject {
var filmid: Int?
}
Run Code Online (Sandbox Code Playgroud)
火力基地代码:
class WatchList: NSObject {
var filmid: Int?
}
Run Code Online (Sandbox Code Playgroud)
我不确定是什么原因造成的。
此外,为了加强这方面的办法就是让他们借此数据,而不是使用NSObject的,使用的方式Codable,并JSONDecoder与火力地堡数据?
我试图了解我可以在协议中使用多少泛型。我的想法如下:
protocol Network {
func fetchCodable<T:Codable>(urlRequest:URLRequest, completion:@escaping (Result<T,Error>)->Void)
}
Run Code Online (Sandbox Code Playgroud)
然后我创建一个名为 AppNetwork 的类来实现网络协议。
extension AppNetwork:Network{
func fetchCodable<T>(urlRequest: URLRequest, completion: @escaping (Result<T, Error>) -> Void) where T : Decodable, T : Encodable {
URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
if let error = error {
completion(.failure(error))
return
}
guard let data = data else{
completion(.failure(AppNetworkError.dataCorrupted))
return
}
do {
let response = try JSONDecoder().decode(T.self, from: data)
completion(.success(response))
}
catch let decodeError{
completion(.failure(decodeError))
}
}.resume()
}
Run Code Online (Sandbox Code Playgroud)
此类是 NetworkHelper 的一部分,它实现了检索数据的功能,例如:
class NetworkHelper{
let …Run Code Online (Sandbox Code Playgroud) 我有以下内容struct
struct Checklist : Codable {
let id: Int64
var text: String?
var checked: Bool
var visible: Bool
var version: Int64
private enum CodingKeys: String, CodingKey {
case id
case text
case checked
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到编译器错误
类型“清单”不符合“可解码”协议
我可以解决的唯一方法是将排除的属性更改为可选。
struct Checklist : Codable {
let id: Int64
var text: String?
var checked: Bool
var visible: Bool?
var version: Int64?
private enum CodingKeys: String, CodingKey {
case id
case text
case checked
}
}
Run Code Online (Sandbox Code Playgroud)
我可以知道为什么会这样吗?这是解决此类编译器错误的唯一正确方法吗?
我有一个来自 20 个领域的对象。当我从服务器获取 json 时,我收到有关 json 解码的错误。
有一种方法可以快速找出哪个字段有问题,而不是删除所有字段并将其一个接一个放回以找出哪个字段有问题。
我在网上找到了在 json 文件中使用硬编码 uuid 的示例,并且这些示例非常适合我,但是当我在应用程序中添加从 json 数组中删除项目的功能时,我需要动态创建这些 uuid
这是我的json文件(list.json),它曾经有硬编码的id,如“id”:1并且有效(当我使用int作为ids时)
[
{
"name": "Dune",
"author": "Frank Herbert",
"page": "77"
},
{
"name": "Ready Player One",
"author": "Ernest Cline",
"page": "234"
},
{
"name": "Murder on the Orient Express",
"author": "Agatha Christie",
"page": "133"
}
]
Run Code Online (Sandbox Code Playgroud)
这是我的结构(Book.swift)
struct Book: Hashable, Codable, Identifiable {
var id = UUID()
var name: String
var author: String
var page: String
}
Run Code Online (Sandbox Code Playgroud)
当我使用此结构和代码(Data.swift)解码我的 json 文件时...
let bookData: [Book] = load("list.json")
func load<T: Decodable>(_ filename: String) -> T …Run Code Online (Sandbox Code Playgroud) 可以说我有一本这样的字典:
{"user_data":{"id":3,"name":"Damian D","email":"aaa@aaa.pl"},"status":true}
Run Code Online (Sandbox Code Playgroud)
我如何使用Codable协议将其解码user_data为struct:
struct User: Codable {
private enum CodingKeys: String, CodingKey {
case id
case username = "name"
case email
}
let id: Int
let username: String
let email: String
}
Run Code Online (Sandbox Code Playgroud)
我是否需要将此子词典转换为数据,还是有更简单的方法?
我需要做Sunset Sunrise App,这是我的代码.但我有这个错误:
序列化json时出错:keyNotFound(Sunrise_Sunset.SunPosition.Results.(CodingKeys in _B4291256871B16D8D013EC8806040532).sunrise,Swift.DecodingError.Context(codingPath:[],debugDescription:"没有与键日出相关的值(\"sunrise \").", underlyingError:nil))
我不明白如何解决它.也许有人有这个问题.我将不胜感激任何帮助)这是API,我有:https://sunrise-sunset.org/api
struct SunPosition: Codable {
struct Results: Codable {
let sunrise: String
let sunset: String
let solarNoon: String
let dayLenght: String
let civilTwilightBegin: String
let civilTwilightEnd: String
let nauticalTwilightBegin: String
let nauticalTwilightEnd: String
let astronomicalTwilightBegin: String
let astronomicalTwilightEnd: String
enum CodingKey:String, Swift.CodingKey {
case sunrise = "sunrise"
case sunset = "sunset"
case solarNoon = "solar_noon"
case dayLenght = "day_length"
case civilTwilightBegin = "civil_twilight_begin"
case civilTwilightEnd = "civil_twilight_end"
case nauticalTwilightBegin …Run Code Online (Sandbox Code Playgroud) 我有这样的JSON响应:
我目前将可解码结构设计如下:
struct PortfolioResponseModel: Decodable {
var dataset: Dataset
struct Dataset: Decodable {
var data: Array<PortfolioData> //I cannot use [Any] here...
struct PortfolioData: Decodable {
//how to extract this data ?
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,如何提取数组中的数据,该数组的值可以为Double或String。
这是在操场上进行这项工作的示例字符串:
let myJSONArray =
"""
{
"dataset": {
"data": [
[
"2018-01-19",
181.29
],
[
"2018-01-18",
179.8
],
[
"2018-01-17",
177.6
],
[
"2018-01-16",
178.39
]
]
}
}
"""
Run Code Online (Sandbox Code Playgroud)
提取数据:
do {
let details2: PortfolioResponseModel = try JSONDecoder().decode(PortfolioResponseModel.self, from: myJSONArray.data(using: .utf8)!)
//print(details2)
//print(details2.dataset.data[0]) //somehow …Run Code Online (Sandbox Code Playgroud) 我正在使用Swift 4,Codable并且正在从Web服务接收以下JSON:
{
"status": "success",
"data": {
"time": "00:02:00",
"employees": [
{
"id": 001,
"name": "foo"
},
{
"id": 002,
"name": "bar"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我只想将employee数组解码为员工对象(time属性将仅保存一次),但是没有任何效果。
我读了很多有关Swift 4的资料,Codable但不知道如何解码该数组。
编辑:我的员工班级:
import Foundation
struct Employee: Codable {
var id: Int
var time: Date
enum CodingKeys: String, CodingKey {
case id = "id"
case time = "time"
}
}
Run Code Online (Sandbox Code Playgroud)
要求:
Alamofire.SessionManager.default.request(Router.syncUsers)
.validate(contentType: ["application/json"])
.responseJSON { response in
if response.response?.statusCode == 200 {
guard let jsonDict = response as? …Run Code Online (Sandbox Code Playgroud) 在SwiftUI beta 5中,Apple引入了@Published批注。该注释当前阻止此类符合Codable协议。
如何符合这些协议,以便可以将此类编码和解码为JSON?您现在可以忽略image属性。
class Meal: ObservableObject, Identifiable, Codable {
enum CodingKeys: String, CodingKey {
case id
case name
case ingredients
case numberOfPeople
}
var id = Globals.generateRandomId()
@Published var name: String = "" { didSet { isInputValid() } }
@Published var image = Image("addImage")
@Published var ingredients: [Ingredient] = [] { didSet { isInputValid() } }
@Published var numberOfPeople: Int = 2
@Published var validInput = false
func isInputValid() {
if name != "" && ingredients.count > 0 { …Run Code Online (Sandbox Code Playgroud)