Every object of class
MyDate
will contain three
stored
properties
inside of it:
year,
month,
day.
Paste the following code into a
playground,
or into the
application(_:didFinishLaunchingWithOptions:)
method of the appliaction delegate.
class MyDate {
var year: Int = 0;
var month: Int = 0;
var day: Int = 0;
init() { //An init method with no arguments.
}
}
var d: MyDate = MyDate(); //Create a new object of class MyDate. Call init.
print("\(d.month)/\(d.day)/\(d.year)");
d.year = 2018;
d.month = 10;
d.day = 20;
print("\(d.month)/\(d.day)/\(d.year)");
0/0/0 10/20/2018
Insert the following
init
method after the no-argument
init
method.
init(month: Int, day: Int, year: Int) { //An init method with three arguments.
self.year = year; //self.year is the property, year is the argument
self.month = month;
self.day = day;
}
Create the following object
e
after the existing object
d.
var e: MyDate = MyDate(month: 10, day: 20, year: 2018); //Call the 3-arg init method.
print("\(e.month)/\(e.day)/\(e.year)");
10/20/2018
Note that a method of an object is allowed to mention the properties
(year,
month,
day)
of the object.
//Change the contents of this object to the next date.
//Assume that every month has 30 days.
func next() {
if day < 30 {
day += 1; //means day = day + 1;
} else {
day = 1; //Go to the first day of the next month.
if month < 12 {
month += 1;
} else {
month = 1; //Go to the first month of the next year.
year += 1;
}
}
}
var e: MyDate = MyDate(month: 10, day: 20, year: 2018);
print("\(e.month)/\(e.day)/\(e.year)");
e.next();
print("\(e.month)/\(e.day)/\(e.year)");
10/20/2018 10/21/2018
//Change the contents of this object to the next date.
//Assume that this year is not a leap year.
func next() {
let length: [Int] = [
0, //Unused. Lets Jan have subscript 1, Feb to have 2, etc.
31, //January
28, //February,
31, //March
30, //April
31, //May
30, //June
31, //July
31, //August
30, //September
31, //October
30, //November
31 //December
];
if day < length[month] {
day += 1;
} else {
day = 1; //Go to the first day of the next month.
if month < 11 {
month += 1;
} else {
month = 1; //Go to the first month of the next year.
year += 1;
}
}
}
var f: MyDate = MyDate(month: 2, day: 28, year: 2018);
print("\(f.month)/\(f.day)/\(f.year)");
f.next();
print("\(f.month)/\(f.day)/\(f.year)");
2/28/2018 2/29/2018
Add another method that uses the array.
func monthsInYear() -> Int { //a method that returns an Int
return length.count - 1; //minus the dummy element
}
print("d.monthInYear = \(d.monthsInYear())");
d.monthInYear = 12
To permit the array to be mentioned in the bodies of more than one method,
let the array be a
stored
property
of the class.
Move the array to imediately before
var year: Int = 0;.
There’s no need to burden every object
(d,
e,
etc.)
with its own copy of the array.
Have them share a single copy.
static let length: [Int] = [
Then in the
next
and
monthsInYear
methods, change
length
to
MyClass.length.
monthsInYear
can be a type method because it does not mention
the
instance
properties
year,
month,
day.
A type method also cannot mention the keyword
self.
class func monthsInYear() -> Int {
return length.count - 1; //minus the dummy element
}
Change
print("d.monthInYear = \(d.monthsInYear())");
to
print("MyDate.monthInYear = \(MyDate.monthsInYear())");
MyDate.monthInYear = 12
Download
MyDate.zip
and open it in Xcode.
Give class
MyDate
an instance method named
prev.
It will be just like
next,
except it will go backwards one day.