【发布时间】:2022-01-17 15:25:52
【问题描述】:
我需要添加什么才能使用 AuthenticatedUserModel 扩展 UserModel 而不会出现此错误?
// 'required' initializer 'init(from:)' must be provided by subclass of 'UserModel'
我知道我也可以将 accessToken 作为可选添加到 UserModel,但我想了解发生了什么,以便更好地理解 swift?
class UserModel: Codable, Identifiable, ObservableObject {
let id: Int
let firstName: String?
let lastName: String?
let username: String?
let bio: String?
let theme: String?
let imageSrc: String?
let interests: [String]?
let followerCount: Int?
let following: Bool?
let followingCount: Int?
let hasCompletedRegistration: Bool?
let isPrivate: Bool?
let readerMode: Bool?
let isActive: Bool?
let isVerified: Bool?
let isSuspended: Bool?
let isAdmin: Bool?
let isFollowing: Bool?
let createdAt: String?
let updatedAt: String?
init(id: Int, firstName: String, lastName: String, bio: String) {
self.id = id
self.firstName = firstName
self.lastName = lastName
self.username = ""
self.bio = ""
self.theme = ""
self.imageSrc = ""
self.interests = [""]
self.followerCount = 0
self.following = false
self.followingCount = 0
self.hasCompletedRegistration = true
self.isPrivate = false
self.readerMode = true
self.isActive = true
self.isVerified = false
self.isSuspended = false
self.isAdmin = false
self.isFollowing = false
self.createdAt = ""
self.updatedAt = ""
}
var name: String {
return "\(firstName ?? "") \(lastName ?? "")"
}
}
class AuthenticatedUserModel: UserModel {
let accessToken: String?
override init(id: Int, firstName: String, lastName: String, bio: String) {
self.accessToken = nil
super.init(id: id, firstName: firstName, lastName: lastName, bio: bio)
}
}
【问题讨论】:
-
我相信是因为 AuthenticationModel 增加了更多的字段,所以 UserModel 的可编码初始化器不适用于新模型。
-
但是,您有这么多可选字段,我认为您最好使用多态模型。我写了一篇关于那个here
-
离题但如果它们属于一起(如与跟随相关的那些)和/或一些 Bool 属性可以组合在一起,也许你可以将所有这些属性中的一些移动到单独的类型中一个枚举?你真的需要一个子类,它是为需要认证的用户提供的,还是它与普通(超类)用户有什么区别?所有修辞问题供您考虑。