Тип не имеет члена

Я играю с игровой площадкой Swift, работающей над новым классом. По какой-то причине я продолжаю получать сообщение об ошибке, что класс «не имеет типа члена» с именем константы, определенной тремя строками ранее. Вот код:

import Foundation
class DataModel {
    let myCalendar = NSCalendar.autoupdatingCurrentCalendar()

    var myData = [NSDate : Float]()
    let now  = NSDate()
    let components = myCalendar.components(.CalendarUnitYear | .CalendarUnitMonth, fromDate: now)
}

Xcode Beta6 продолжает выдавать мне ошибку во второй строке, говоря, что «DataModel.Type не имеет члена с именем« myCalendar »

Хотя я не думаю, что это должно иметь значение, я попытался определить myCalendar как var.


person user1790252    schedule 30.08.2014    source источник


Ответы (2)


Вы не можете инициализировать свойство класса экземпляра, ссылающееся на другое свойство экземпляра того же класса, потому что не гарантируется, в каком порядке они будут инициализированы, и swift запрещает это, следовательно, (вводящая в заблуждение) ошибка компилятора.

Вы должны переместить инициализацию в конструктор следующим образом:

let components: NSDateComponents

init() {
    self.components = myCalendar.components(.CalendarUnitYear | .CalendarUnitMonth, fromDate: now)
}
person Antonio    schedule 30.08.2014
comment
Работал как шарм. Спасибо, Антонио! - person user1790252; 31.08.2014

Я согласен с @Antonio Другим способом может быть создание struct, если вы не хотите использовать init:

class DataModel {

    struct MyStruct {
        static var myCalendar:NSCalendar = NSCalendar.autoupdatingCurrentCalendar()
        static let now  = NSDate()
    }

    var myData = [NSDate : Float]()

    var components = MyStruct.myCalendar.components(.CalendarUnitYear | .CalendarUnitMonth, fromDate: MyStruct.now)
}

Проверить

var model:DataModel = DataModel()
var c = model.components.year  // 2014
person Maxim Shoustin    schedule 30.08.2014
comment
Это также сработало; Я отметил ответ @Antonio как правильный только потому, что он лучше соответствует моему общему проекту. Благодарю вас! - person user1790252; 31.08.2014