Я считаю, что эта проблема не слишком сложна.
Обычно с ошибками сегментации Swift возникают, когда вы пытаетесь установить значение константы (let) или пытаетесь установить значение того, что не было объявлено должным образом.
я могу обнаружить один такой экземпляр здесь:
required init(json: JSON) {
bytesLeft = json["someProperty"].stringValue
}
Там две вещи неправильно с этим примером. У вас есть (назначенный) инициализатор, который заканчивается без установки свойства someProperty, и вы не указали переменную bytesLeft.
Итак, теперь проблема (которую я действительно должен был замечен раньше), что * modelClass * только не является класс (или иначе Инициализационным типа). Чтобы не иметь прямого доступа к протоколу, вы можете получить доступ только к классу, соответствующему протоколу. Компилятор не заметил этого, потому что вы сделали что-то скрытое с . Тип.
Когда я говорю о доступе, я имею в виду функции и свойства, включая инициализаторы. Только класс может создать экземпляр класса, который сам по себе является типом экземпляра, а протоколы не могут иметь экземпляры bonafide. Если вы тщательно об этом подумаете, невозможно точно определить, что вы пытаетесь сделать здесь.Предположим, что мы имели протокол
protocol JSONModel {
init(json: JSON)
}
но два класса:
class CurrentDownload: JSONModel {
let someProperty: String
required init(json: JSON) {
//Some other code perhaps.
someProperty = json["someProperty"].stringValue
}
}
class FutureDownload: JSONModel {
let differentProperty: String
required init(json: JSON) {
//Different code.
differentProperty = json["differentProperty"].stringValue
}
}
тогда как раньше можно было бы утверждать, что
JSONModel.Type(json: JSON)
(этот код эквивалентен код) должен составить и запустить, потому что мы дали реализацию init, теперь мы не можем отрицать, что есть путаница - какую реализацию мы должны использовать здесь? Он не может выбрать один, и большинство из них утверждают, что он не должен пытаться, и это не так.
Что вам нужно сделать, это инициализировать какой-то класс. Если вы ищете минимальный класс, который придерживается JSONModel и не более, вам нужно написать такой класс, например.
class BasicJSONModel: JSONModel {
let someProperty: String
required init(json: JSON) {
//Some other code perhaps.
someProperty = json["someProperty"].stringValue
}
}
Затем сделайте
private let modelClass: BasicJSONModel//.Type not needed with a class
let model = modelClass(json: modelJSON)
, конечно, это, вероятно, глупо и один может просто написать
let model = BasicJSONModel(json: modelJSON)
Или вы могли бы просто написать общий суперкласс, если только использовать протокол является для этого:
class SuperJSONModel {
let someProperty: String//This is not needed of course and you could just strip down to the init only.
init(json: JSON) {
//Some other code perhaps.
someProperty = json["someProperty"].stringValue
}
}
, а затем вы хотите проверить, что какой-то объект «соответствует» тому, что было JSONModel, вы просто проверяете, что это подкласс SuperJSONModel.
Попробуйте перезагрузить xcode. – Thellimist
Благодарим вас за ответ. Я попытался перезапустить Xcode, но, к сожалению, это не исправило мою проблему. – naglerrr
Если вы скопировали этот фрагмент кода из сети, попробуйте переписать его вручную. Могут быть символы спецификации. Это могут привести к дополнительным значениям. – Thellimist