Тип «SNstorelocation» не имеет подписных элементов - я просто не понимаю - PullRequest
0 голосов
/ 03 декабря 2018

Я с удовольствием программирую на Swift в течение нескольких недель - действительно наслаждаюсь этим, но я попал в блок.Я гуглил и не могу найти объяснения.Я создал гораздо более простой тестовый пример, у которого не было такой же проблемы.

Я получаю сообщение об ошибке "Тип 'SNstorelocation' не имеет нижестоящих элементов", а также "Значение типа '[SNstorelocation]?'У меня нет члена 'append' ".

Я много читал о подписке, но не думаю, что это проблема.Я хочу иметь массив структур, один из элементов также является массивом структур.Я видел это повсюду, и в моем маленьком тестовом примере это не сработало.

Итак, я пришел к выводу (возможно, неправильно!), Что почему-то я не создал и не создал массив.Если бы я имел, у него должен быть индекс для доступа к данным, и код должен работать, но это не так.

Вот небольшой пример, который я создал, который я считаю таким же, как мой пример, но более простой, который работает.

struct test1 {var t1Item1: Int?var t1Item2: String?var myArray = test2} struct test2 {var t2Item1: Int?var t2Item2: Int?

    init(v1: Int, v2: Int) {
        self.t2Item1 = v1
        self.t2Item2 = v2
    }
}

, и я могу делать все обычные операции с массивами:

var myVar = [test1]()
var newItem = test1()
newItem.t1Item1 = 1
newItem.t1Item2 = "Hi"
myVar.append(newItem)
let myCount = myVar[0].myArray.count

Где в качестве примера (всего несколько элементов из структуры удалены, чтобы упростить задачу)и коротко)

struct SNStoreItemGroups: Codable {
    var Welland: [SNStoreItem]
    var Other: [SNStoreItem]

    init() {
        self.Welland = []
        self.Other = []
    }
}
struct SNStoreItem: Codable {

    var locations =  [SNstorelocation]()
    var customerName: String?
    var customerPhone: String?
    var customerEmail: String?
    var notes: String?


}
struct SNstorelocation: Codable {
    let longitude: Double
    let latitude: Double
    let country: String
    let user: Int
    let timestamp: Double = Date().timeIntervalSinceReferenceDate
    init(_ lon: Double, _ lat: Double, _ ISOcountry: String, _ UserID: Int) {
        self.longitude = lon
        self.latitude = lat
        self.country = ISOcountry
        self.user = UserID
    }
}

var mySNData: SNStoreItem?
var SNStore: SNStoreItemGroups = SNStoreItemGroups()
// Some code to populate the SNStore



if let locIndex = SNStore.Welland[index].locations.index(where: { $0.longitude == MyLongitude }) {
    // This then causes the error
    // "Type 'SNstorelocation' has no subscript members"
                        if SNStore.Welland[index].locations[locIndex].timestamp {

                        }
                        }

Может кто-нибудь объяснить, почему во втором примере нет подписок, а первый работает нормально?Я просто не понимаю - особенно из-за первого запроса, который, кажется, подходит для поиска индекса - я уверен, что только что сделал что-то глупое!

TIA.

1 Ответ

0 голосов
/ 04 декабря 2018

Неоднозначное сообщение об ошибке компилятором Swift…

A timestamp не является логическим значением, поэтому вам нужно сравнить временную метку с чем-то.

if let locIndex = mySNStore.welland[index].locations.index(where: { $0.longitude == 0.1234 }) {

    if mySNStore.welland[index].locations[locIndex].timestamp == Double(42) {

    }

}

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

let location = mySNStore.welland[index].locations[locIndex]
if location.timestamp {

}

Вы можете вызвать ошибку с командой Swift на этом.

И какСтиль точки Заглавные переменные читать ужасно, потому что они выглядят как имена классов.

...