2016-03-09 3 views
1

Я обнаружил ошибку при проверке некоторых кодов от Github.Два похожих класса показывают разные ошибки инициализации

class Profile { 

let text: String 
let date: String 
let id: String? 


init?(data: NSDictionary?) { 

    if let text = data?.valueForKeyPath(Test.Text) as? String { 
     self.text = text 
      if let date = data?.valueForKeyPath(Test.Created) as? String { 
       self.date = date 
       id = data?.valueForKeyPath(Test.ID) as? String 
      } 
    }else{ 
     return nil 
    } 
} 
struct Test { 
    static let Text = "text" 
    static let Created = "created" 
    static let ID = "id" 
    } 
} 

Линия init? показывает ошибку «константы self.data использовали до инициализации.»

И создать подобный класс его, как

class Context { 
let words: String 

init?(text:String?) { 
    if let words = text { 
     self.words = words 

    }else{ 
     return nil 
    } 
    } 
} 

На этот раз он показывает «все сохраненные свойства экземпляра класса должны быть инициализированы перед returing ноля из инициализатора.»

Для первого, есть обходное решение, что я могу удалить блок else и дать каждому свойству пустое значение исправить ошибку. Однако мне пришлось бы изменить свойства, изменяемые. (я не хочу, чтобы он был изменчивым)

И для второго примера я просто вставляю self.word = "", прежде чем линия return nil также может исправить эту ошибку.

Но я действительно удивляюсь, почему эти подобные случаи показывают разные ошибки и реализуют логику Свифта и как я могу исправить это правильно?

Спасибо, что помогли мне.

ответ

0

Инициализаторы Йорка являются неполными, и именно поэтому вы получаете сообщение. Swift - это сохранение типа, что означает, что все необязательные свойства должны быть инициализированы до возвращения класса. Даже когда класс возвращает нуль. во-вторых, вы не можете называть себя (это сам класс), если вы не инициализировали класс. Однако это не должно быть проблемой в вашем случае, так как вы определили корневой класс. Для вашего первого класса, пожалуйста, реализуйте такой код, и он должен работать.

class Profile { 

struct Test { 
    static let Text = "text" 
    static let Created = "created" 
    static let ID = "id" 
} 

let text: String 
let date: String 
let id: String? 

init?(data: NSDictionary?) { 

    guard let tempText = data?.valueForKeyPath(Test.Text) as? String else { 

     text = "" 
     date = "" 
     id = nil 
     return nil 
    } 

    text = tempText 
    if let tempDate = data?.valueForKeyPath(Test.Created) as? String { 
     date = tempDate 
     id = data?.valueForKeyPath(Test.ID) as? String 
    } else { 
     date = "" 
     id = nil 
    } 

} 

}

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

+0

Спасибо большое, я понять это !! И я думаю, вам нужно больше узнать, как использовать инициализатор в Swift. – Donny

+0

Привет, Донни, инициализация классов немного сложна в Swift, так как Swift выглядит очень легко, но вам все равно нужно применять стандартные объективные ориентированные принципы, как в Objective-C. Если вы хотите получить хорошие лекции по Swift, см. Курс Swift в iTunes U из Университета Плимута. У них также есть эта лекция по классам и инициализации. https://itunes.apple.com/nl/course/section-3-step-5-dismissing/id950659946?i=356885145&mt=2 – MacUserT

1

Пробуйте эту версию кода.

Код 1:

class Profile { 

    var text: String = "" 
    var date: String = "" 
    var id: String? = "" 


    init?(data: NSDictionary?) { 

     if let text = data?.valueForKeyPath(Test.Text) as? String { 
      self.text = text 
      if let date = data?.valueForKeyPath(Test.Created) as? String { 
       self.date = date 
       id = data?.valueForKeyPath(Test.ID) as? String 
      } 
     }else{ 
      return nil 
     } 
    } 
    struct Test { 
     static let Text = "text" 
     static let Created = "created" 
     static let ID = "id" 
    } 
} 

Код 2:

class Context { 
    var words: String = "" 

    init?(text:String?) { 
     if let words = text { 
      self.words = words 
     } else { 
      return nil 
     } 
    } 
} 
Смежные вопросы