Опционы Swift в методах класса - PullRequest
0 голосов
/ 23 марта 2020

Я все еще относительно новичок в Swift, поэтому у меня возникли некоторые проблемы с правильным синтаксисом. Вот мой код для класса Дата , который имеет методы isLeapYear и daysInMonth . У меня проблемы с дополнительными функциями для этих методов:

class Date {
    var day, month, year : Int

    init (day : Int, month : Int, year : Int) {
        self.day = day
        self.month = month
        self.year = year
    }

    func isLeapYear(y : Int? = self.year) -> Bool {  
        var x = false
        if y % 4 == 0 {x = true}
        return x
    }

    //Returns the amount of days in a given month
    func daysInMonth(month : Int? = self.month, year : Int? = self.year) -> Int? {
        let _31_day_months = [1, 3, 5, 7, 8, 10, 12]
        let _30_day_months = [4, 6, 9, 11]
        if month == 2 {
            if self.isLeapYear(y : year) {return 29}  else {return 28}
        }
        else if _31_day_months.contains(month) {return 31}
        else if _30_day_months.contains(month) {return 30}
        else {return nil}
    }
}

Что я хочу сделать с func isLeapYear(y : Int? = self.year) -> Bool, так это то, что когда я вызываю isLeapYear, а y не указывается, он автоматически устанавливается на self.year . Однако я получаю следующую ошибку:

использование неразрешенного идентификатора 'self'

Я также получаю ошибку

значение необязательного типа "Int? должен быть развернут в значение типа 'Int'

Я знаю, что должен использовать ! , но я не знаю точно, как и где, я пытался сделать if y! % 4 == 0, но это только ухудшило ситуацию.

Я бы тоже хотел сделать то же самое для метода daysInMonth

1 Ответ

2 голосов
/ 23 марта 2020

Значения по умолчанию должны быть постоянными во время компиляции. Вы не можете определить их с точки зрения какого-либо другого свойства. Вам нужно проверить их значения во время выполнения. В вашем примере это будет:

func isLeapYear(y : Int? = nil) -> Bool {
    var x = false
    if (y ?? year) % 4 == 0 {x = true}  // <== "?? year" meaning "y, or year if y is nil"
    return x
}

Обратите внимание, что это очень запутанный API. Вам нужно будет создать случайный Date экземпляр, чтобы проверить что-то не связанное с этим экземпляром. Вместо этого, я полагаю, вы действительно имеете в виду два метода; одна оценка c и одна в экземпляре:

// Static method, called as Year.isLeapYear(xxxx)
static func isLeapYear(_ y: Int) -> Bool {
    // Note that this is not the correct Gregorian Leap Year rule
    return y % 4 == 0
}

// Instance method, called as year.isLeapYear()
func isLeapYear() -> Bool { Date.isLeapYear(year) }

Поскольку вы новичок в Swift, стоит отметить: это должна быть структура, а не класс (это чистое значение, которое не имеет идентичность, и любые две Даты с одинаковыми свойствами должны считаться одной и той же датой, для чего предназначены структуры). И вы должны быть осторожны, называя это «Дата», поскольку это сталкивается с типом Foundation с тем же именем.

...