如何使用 Date 而不是 dateComponents swift

how to use Date instead dateComponents swift

我对编程世界还很陌生。我已经开始作为实习生工作,我需要在那里学习 Swift。我有一个创建 class 足球运动员的练习。

我在下面有这段代码,我正在使用 DateComponents 来获取生日,有一种方法可以只使用 Date 吗? 我被告知将 Date 转换为 DateComponents 但我无法弄清楚。

这是我试过的代码:

let dateFormater = DateFormatter()
dateFormater.dateFormat = "MM/dd/yyyy"
dateFormater.string(from: birthday)

但是我无法在我的对象中定义 Date

import UIKit
import Darwin
import Foundation
class SoccerPlayer {
    let name: String
    var position: String
    var birthday: DateComponents
    let nationality: String
    var height: Double
    var weight: Int
    init(name: String, position: String, birthday: DateComponents, nationality: String, height: Double, weight: Int) {
        self.name = name
        self.position = position
        self.birthday = birthday
        self.nationality = nationality
        self.height = height
        self.weight = weight
    }
    func printInfo() {
        let printOut: String = "name:\(name), position:\(position), birthday:\(birthday), nationality:\(nationality),height:\(height),weight:\(weight)"
        print(printOut)
    }
    func calculationAge() -> Int {
        let calendar = Calendar.current
        let now = calendar.dateComponents([.year, .month, .day], from: Date())
        let ageComponents = calendar.dateComponents([.year], from: birthday, to: now)
        let age = ageComponents.year!
        return age
    }
    func calculateRetire() -> Int {
        var yearsToRetire = 0
        if (self.position == "defense") {
            yearsToRetire = 40 - self.calculationAge()
        }
        else if(self.position == "halfField") {
            yearsToRetire = 38 - self.calculationAge()
        }
        else if(self.position == "attacker") {
            yearsToRetire = 35 - self.calculationAge()
        }
        return yearsToRetire
    }
}
enum PlayerPosition: String {
    case attacker = "Attacker"
    case halfField = "HalfField"
    case defense = "Defense"
    var description: String {
        get {
            return self.rawValue
        }
    }
}
  
var player1: SoccerPlayer = SoccerPlayer(name: "Andre", position: PlayerPosition.defense.description, birthday: DateComponents(year: 1998, month: 7, day: 1), nationality: "Brazilian", height: 1.70, weight: 70)

        player1.printInfo()

它打印:

name:Andre, position:Defense, birthday:year: 1998 month: 7 day: 1 isLeapMonth: false , nationality:Brazilian,height:1.7,weight:70

如果您需要使用日期组件创建日期,您还需要传递日历组件:

DateComponents(calendar: Calendar(identifier: .iso8601), year: 1998, month: 7, day: 1).date!

除此之外,您的代码还有很多地方需要改进。位置 属性 应该是您现有的枚举。您可以将年龄计算方法移动到 Date 的计算 属性 实例。我还会创建一个 DateFormatter 来显示生日。另请注意,如果您想为播放器创建自定义描述,您可以使其符合 CustomStringConvertible 并且当您向 model/class.

添加描述时它已经这样做了

您需要将这些扩展添加到您的项目中:

extension Formatter {
    static let birthday: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = .current
        formatter.locale = .init(identifier: "pt_BR") // or en_US or current if you want to localize your date description
        formatter.setLocalizedDateFormatFromTemplate("MMMMd")  // if you would like to include the year use yyyyMMMMd
        return formatter
    }()
}

extension Date {
    var age: Int {
        Calendar(identifier: .iso8601).dateComponents([.year], from: self, to: Date()).year ?? .zero
    }
    var birthday: String {
        Formatter.birthday.string(from: self)
    }
}

您的代码应该类似于:

class SoccerPlayer {
    let name: String
    var position: Position
    var dob: Date
    let nationality: String
    var height: Double
    var weight: Int
    init(name: String, position: Position, dob: Date, nationality: String, height: Double, weight: Int) {
        self.name = name
        self.position = position
        self.dob = dob
        self.nationality = nationality
        self.height = height
        self.weight = weight
    }
    var yearsToRetire: Int {
        switch position {
        case .defense:
            return 40 - dob.age
        case .halfField:
            return 38 - dob.age
        case .attacker:
            return 35 - dob.age
        }
    }
}

extension SoccerPlayer: CustomStringConvertible {
    var description: String {
        "Name: \(name), Position: \(position), Birthday: \(dob.birthday), Nationality: \(nationality), Height: \(height), Weight: \(weight)"
    }
}

extension SoccerPlayer {
    enum Position: String {
        case attacker, halfField, defense
    }
}

extension SoccerPlayer.Position: CustomStringConvertible {
    var description: String { rawValue.capitalized }
}

用法:

let player1Dob = DateComponents(calendar: Calendar(identifier: .iso8601), year: 1998, month: 7, day: 1).date!
var player1: SoccerPlayer = .init(
    name: "Andre",
    position: .defense,
    dob: player1Dob,
    nationality: "Brazilian",
    height: 1.7,
    weight: 70
)
player1.yearsToRetire  // 17
print(player1)

这将打印:

Name: Andre, Position: Defense, Birthday: 1 de julho, Nationality: Brazilian, Height: 1.7, Weight: 70