首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制后Swift NSCopying为空

复制后Swift NSCopying为空
EN

Stack Overflow用户
提问于 2021-11-30 07:53:35
回答 1查看 40关注 0票数 0

所以我继承了这个密码。但是我有一个团队类和一个复制函数。让我先给你看看这个班:

代码语言:javascript
复制
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
    }
}

我加入了一个团队

代码语言:javascript
复制
 let team = Team(data: teamJson, radius: sport.radius, objectId: sportTeam.objectId ?? "")

后来我复制了那支队伍

代码语言:javascript
复制
let newTeam = team.copy() as! Team

所以我仍然在学习这些东西,但我假设团队和newTeam是一样的。但是newTeam都是空的。

代码语言:javascript
复制
<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,那么所有的数据都在那里。特别是在数据属性中。但是在复制之后,这些都是默认的数据。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-30 23:36:04

只需从另一个类型的对象中编写私有初始化程序,并在copy(with:)实现中使用:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70165950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档