所以我继承了这个密码。但是我有一个团队类和一个复制函数。让我先给你看看这个班:
class Team: NSObject, NSCopying {
struct Keys {
static let sportsID = "SportsID"
static let stampId = "StampNumber"
static let associationID = "AssociationID"
static let team = "Team"
static let conference = "Conference"
static let latitude = "Latitude"
static let longitude = "Longitude"
static let GPSLatitude = "GpsLatitude"
static let GPSLongitude = "GpsLongitude"
static let backgroundColor = "BackgroundColor"
static let letterColor = "LetterColor"
static let isActive = "IsActive"
static let venueLocation = "VenueLocation"
static let city = "City"
static let state = "State"
static let stadiumCampus = "StadiumCampus"
static let letterName = "LetterName"
static let backgroundImage = "BackgroundImage"
static let homeStampImag = "HomeStamp"
}
var objectId: String = ""
var sportsID: Int = -1
var associationID: Int = -1
var stampId: Int = -1
var team: String = ""
var conference: String = ""
var stadiumCampus: String = ""
var latitude: Double = 0.0
var longitude: Double = 0.0
var radius: Double = 100
var backgroundColorString: String = ""
var letterColor: String = ""
var letterName: String = ""
var isActive: Bool = false
var venueLocation: String = ""
var city: String = ""
var state: String = ""
var backgroundImageId: Int = 1
var backgroundImage: UIImage?
var homeStampImag: PFFileObject?
var stampImage: UIImage?
var rotationAngle: CGFloat = CGFloat.random(in: -120...160)
var date: String = ""
var timestamp: Date = Date()
var data: [String: Any] = [:]
var isHomeTeam: Bool = false
init(data: [String: Any] = [:], radius: Double, objectId: String = "") {
super.init()
self.objectId = objectId
self.sportsID = data[Keys.sportsID] as? Int ?? -1
self.stampId = data[Keys.stampId] as? Int ?? -1
self.date = UserDefaults.standard.string(forKey: "StampIdDate: \(self.stampId)") ?? ""
self.associationID = data[Keys.associationID] as? Int ?? -1
self.team = data[Keys.team] as? String ?? ""
self.conference = data[Keys.conference] as? String ?? ""
self.stadiumCampus = data[Keys.stadiumCampus] as? String ?? ""
self.latitude = (data[Keys.latitude] as? Double ?? 0.0) == 0.0 ? data[Keys.GPSLatitude] as? Double ?? 0.0 : data[Keys.latitude] as? Double ?? 0.0
self.longitude = (data[Keys.longitude] as? Double ?? 0.0) == 0.0 ? data[Keys.GPSLongitude] as? Double ?? 0.0 : data[Keys.longitude] as? Double ?? 0.0
self.letterName = data[Keys.letterName] as? String ?? ""
self.letterColor = data[Keys.letterColor] as? String ?? ""
self.backgroundColorString = data[Keys.backgroundColor] as? String ?? ""
self.isActive = data[Keys.isActive] as? Bool ?? false
self.venueLocation = data[Keys.venueLocation] as? String ?? ""
self.city = data[Keys.city] as? String ?? ""
self.state = data[Keys.state] as? String ?? ""
self.radius = radius
self.backgroundImageId = data[Keys.backgroundImage] as? Int ?? 1
guard let stampImage = data[Keys.homeStampImag] as? PFFileObject else { return }
self.homeStampImag = stampImage
if self.venueLocation.isEmpty {
self.venueLocation = self.team
}
if self.stadiumCampus.isEmpty {
self.venueLocation = self.city + ", " + self.state
}
self.data = data
}
func copy(with zone: NSZone? = nil) -> Any {
let copy = Team(data: data, radius: radius, objectId: objectId)
return copy
}
}我加入了一个团队
let team = Team(data: teamJson, radius: sport.radius, objectId: sportTeam.objectId ?? "")后来我复制了那支队伍
let newTeam = team.copy() as! Team所以我仍然在学习这些东西,但我假设团队和newTeam是一样的。但是newTeam都是空的。
<Pass_Sports.Team: 0x105fdb4e0> #0
- super: NSObject
- objectId: "iY012BOok2"
- sportsID: -1
- associationID: -1
- stampId: -1
- team: ""
- conference: ""
- stadiumCampus: ""
- latitude: 0.0
- longitude: 0.0
- radius: 100.0
- backgroundColorString: ""
- letterColor: ""
- letterName: ""
- isActive: false
- venueLocation: ""
- city: ""
- state: ""
- backgroundImageId: 1
- backgroundImage: nil
- homeStampImag: nil
- stampImage: nil
- rotationAngle: -31.274499700732946
- date: ""
▿ timestamp: 2021-11-30 07:38:43 +0000
- timeIntervalSinceReferenceDate: 659950723.884164
- data: 0 key/value pairs
- isHomeTeam: false请告诉我,如果我需要给你任何其他东西来解决这个问题。顺便说一句,我确实转储了teamJson,它已经填充了所有的元素。正如我所说的,如果我在复制之前转储team,那么所有的数据都在那里。特别是在数据属性中。但是在复制之后,这些都是默认的数据。
谢谢
发布于 2021-11-30 23:36:04
只需从另一个类型的对象中编写私有初始化程序,并在copy(with:)实现中使用:
private init(other: Self) {
self.sportsID = other.sportsID
// etc
super.init()
}
func copy(with zone: NSZone? = nil) -> Any {
Self(other: self)
}PS:我不知道objectId属性在您的代码中是否有一个策略,可以使副本与原来的不同,因此也要考虑到这一点。
PPS:您的初始化程序有一个卫士语句,它也将在设置数据属性之前返回,并且在设置属性之前调用super.init()。因此,init可以将整个对象设置为默认值,因此它永远不能将data属性设置为非空值,因为这是因为早期退出时使用了卫士语句。由于我不知道修改init是否会在代码的其他部分引入任何副作用,所以我建议使用仅由copy(with)使用的附加私有初始化程序,而不是修复原始init。
https://stackoverflow.com/questions/70165950
复制相似问题