- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在应用程序中,我们有两种类型的贴纸,字符串和位图。每个贴纸包都可以包含两种类型。这就是我声明模型的方式:
// Mark: - Models
protocol Sticker: Codable {
}
public struct StickerString: Sticker, Codable, Equatable {
let fontName: String
let character: String
}
public struct StickerBitmap: Sticker, Codable, Equatable {
let imageName: String
}
在用户选择了一些贴纸并使用它们之后,我们希望将贴纸保存到 UserDefaults
中,这样我们就可以向他显示“最近使用过的”贴纸选项卡。我正在尝试解码保存的 [Sticker]
数组:
let recentStickers = try? JSONDecoder().decode([Sticker].self, from: data)
但是我得到以下编译错误:
Protocol type 'Sticker' cannot conform to 'Decodable' because only concrete types can conform to protocols
我不明白为什么我将 Sticker
声明为 Codable
而它也实现了 Decodable
。任何帮助将不胜感激!
câu trả lời hay nhất
而不是协议(protocol)使用泛型。
声明一个简单的函数
func decodeStickers(from data : Data) throws -> T
{
return try JSONDecoder().decode(T.self, from: data)
}
T
可以是单个对象,也可以是数组。
在您的结构中删除 Sticker
协议(protocol)。您还可以删除 Equatable
,因为它正在结构中合成。
public struct StickerString : Codable {
let fontName: String
let character: String
}
public struct StickerBitmap : Codable {
let imageName: String
}
要解码其中一种贴纸类型,请注释该类型
let imageStickers = """
[{"imageName":"Foo"},{"imageName":"Bar"}]
"""
let stickerData = Data(imageStickers.utf8)
let recentStickers : [StickerBitmap] = try! decodeStickers(from: stickerData)
print(recentStickers.first?.imageName)
Và
let stringSticker = """
{"fontName":"Times","character":""}
"""
let stickerData = Data(stringSticker.utf8)
let sticker : StickerString = try! decodeStickers(from: stickerData)
print(sticker.character)
要解码 StickerString
Và StickerBitmap
类型的数组,请声明一个具有关联值的包装器枚举
enum Sticker: Codable {
case string(StickerString)
case image(StickerBitmap)
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
LÀM {
let stringData = try container.decode(StickerString.self)
self = .string(stringData)
} catch DecodingError.keyNotFound {
let imageData = try container.decode(StickerBitmap.self)
self = .image(imageData)
}
}
func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
switch self {
case .string(let string) : try container.encode(string)
case .image(let image) : try container.encode(image)
}
}
}
然后就可以解码了
let stickers = """
[{"imageName":"Foo"},{"imageName":"Bar"}, {"fontName":"Times","character":""}]
"""
let stickerData = Data(stickers.utf8)
let recentStickers = try! JSONDecoder().decode([Sticker].self, from: stickerData)
print(recentStickers)
在 TableView 中只需切换
枚举
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let sticker = stickers[indexPath.row]
switch sticker {
case .string(let stringSticker):
let cell = tableView.dequeueReusableCell(withCellIdentifier: "StringStickerCell", for: indexPath) as! StringStickerCell
// update UI
return cell
case .image(let imageSticker):
let cell = tableView.dequeueReusableCell(withCellIdentifier: "ImageStickerCell", for: indexPath) as! ImageStickerCell
// update UI
return cell
}
}
关于ios - 协议(protocol)类型不能符合协议(protocol),因为只有具体类型才能符合协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57026463/
Tôi đang cố gắng viết một thư viện khá đa hình. Tôi rơi vào tình huống dễ thể hiện điều đó nhưng lại khó nói về nó hơn. Nó trông hơi giống thế này: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
Có ai có thể giải thích cách biểu thức này hoạt động không? type = type || 'any'; Điều này có nghĩa là sử dụng 'any' nếu loại không được xác định? Câu trả lời hay nhất Nếu loại là "falsy" (tức là sai hoặc không xác định
Tôi có một giao diện, trong IAnimal.fs, không gian tên Kingdom loại IAnimal = thành viên trừu tượng Eat : Food -> unit và một thành công khác
Câu hỏi này đã có câu trả lời ở đây: đã đóng cửa 10 năm trước. Có thể trùng lặp: Sự khác biệt giữa giá trị (loại) và loại (va)
Trong C#, có sự khác biệt giữa mặc định (Nullable) không? (hoặc mặc định(dài?) ) và mặc định(dài) ? Long chỉ là một ví dụ, nó có thể là bất kỳ loại cấu trúc nào khác. hầu hết
Giả sử tôi có một lớp trường hợp: case class Foo(num: Int, str: String, bool: Boolean) Bây giờ tôi cũng có một trình bao bọc đơn giản: seal trait Wrapper[
Câu hỏi này đã có câu trả lời ở đây: Tạo loại đại biểu C# với tham số ref khi chạy (1 câu trả lời) Đã đóng 2 năm trước. Để tạo một đại biểu một cách nhanh chóng (dele
Tôi đang cố gắng lấy dct của một hình ảnh. Lúc đầu, tôi gặp lỗi Chức năng/tính năng không được triển khai (DCT kích thước lẻ không được triển khai
Tôi đang cố gắng sử dụng AFPropertyListRequestOperation của AFNetworking, nhưng khi tôi cố tải xuống, tôi gặp lỗi Expected content type {("application/x-plist")},
Tôi đang gặp lỗi bên dưới. Tôi biết mã này có nghĩa là gì, nhưng tôi không biết giao diện sẽ trông như thế nào: Phần tử ngầm có loại 'bất kỳ' vì biểu thức chỉ mục là
Tôi cố gắng mở rộng SignalType từ ReactiveCocoa sang ErrorType tùy chỉnh, mã như sau enum MyError: ErrorType { // .. case }
Tôi không thể tìm thấy câu trả lời trong bất kỳ câu hỏi nào khác. Giả sử tôi có một siêu lớp trừu tượng Tóm tắt0, có hai lớp con Concrete1 và Concrete1. Tôi muốn có thể định nghĩa các lớp trong Tóm tắt0
Tôi muốn biết tại sao chỉ mục này không được sử dụng trong loại RANGE mà trong INDEX: Index: CREATE INDEX myindex ON order(order_date);
Tôi đang sử dụng RxJava và bây giờ tôi cố gắng đăng ký một thiết bị có thể quan sát được bằng cách cung cấp lambda: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
Tôi đã thử hầu hết mọi giải pháp cho vấn đề, bao gồm cả. Còn nhiều cách khác để sử dụng app.use(express.static('public')) cho loại được cung cấp, nhưng dường như tôi không thể tìm ra giải pháp cho việc này. index.js: imp
Bộ chọn CSS nào sau đây nhanh hơn? input[type="submit"] { /* styles */ } hoặc [type="submit"] { /* styles */ } đều ổn
Tôi không biết có gì sai với thiết lập này, tôi nhận được tất cả các chú thích (@Controller, @Repository, @Service) trong IDEA và nó hiển thị Bean ở bên trái của số dòng rồi chuyển đến Bean đó. Đây là lỗi: 14-
Tôi đã làm theo lời khuyên khi đăng ký hàm java làm hàm gọi lại trong hàm C và tôi có thể sử dụng các loại "đơn giản" như số nguyên và chuỗi cho hàm gọi lại, ví dụ: jstring j
Có một số lớp java, được tải vào cơ sở dữ liệu Oracle (phiên bản 11g) và các trình bao bọc hàm pl/sql: tạo hoặc thay thế hàm getDataFromJava( in_uLis
Tôi đã lấy mã từ lệnh gọi lại hoạt ảnh css của David Walsh và sửa đổi nó thành TypeScript. Tuy nhiên, tôi gặp lỗi và không biết tại sao: giao diện IBrowserPrefix { [
Tôi là một lập trình viên xuất sắc, rất giỏi!