如何使用 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
我对编程世界还很陌生。我已经开始作为实习生工作,我需要在那里学习 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