两个相似的类显示不同的初始化错误

时间:2016-03-09 17:45:05

标签: ios iphone swift class initialization

当我从Github测试一些代码时发现了一个错误。

    Array
(
    [1] => /myPath/folderFoo/1.jpg
    [2] => /myPath/folderFoo/2.jpg
    [3] => /myPath/folderFoo/3.jpg
    [4] => /myPath/folderFoo/4.jpg
    [5] => /myPath/folderFoo/5.jpg
    [6] => /myPath/folderFoo/6.jpg
    [7] => /myPath/folderFoo/7.jpg
    [8] => /myPath/folderFoo/8.jpg
    [9] => /myPath/folderFoo/9.jpg
    [11] => /myPath/folderFoo/11.jpg
    [12] => /myPath/folderFoo/12.jpg
    [13] => /myPath/folderFoo/13.jpg
    [14] => /myPath/folderFoo/14.jpg
    [15] => /myPath/folderFoo/15.jpg
    [16] => /myPath/folderFoo/16.jpg
    [17] => /myPath/folderFoo/17.jpg
    [18] => /myPath/folderFoo/18.jpg
    [199] => /myPath/folderFoo/199.jpg
)

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" } } 行显示错误“在初始化之前使用的常量self.data。”

我创建了一个类似的类,比如

init?

这次它显示“必须在从初始化程序中撤回nil之前初始化类实例的所有存储属性。”

对于第一个,有一个解决方法,我可以删除class Context { let words: String init?(text:String?) { if let words = text { self.words = words }else{ return nil } } } 块并给每个属性一个空值来修复错误。但是它会让我改变属性可变。 (我不希望它变得可变)

对于第二个示例,我只是在else行之前插入self.word = ""也可以修复错误。

但我真的很想知道为什么这些类似的案例会显示不同的错误并实现Swift的逻辑,我该如何正确修复它呢?

感谢您帮助我。

2 个答案:

答案 0 :(得分: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
        }
    }
}

答案 1 :(得分:0)

York初始化程序不完整,这就是您收到消息的原因。 Swift是类型save,这意味着必须在返回类之前初始化所有非可选属性。即使班级返回零。其次,如果你没有初始化类,你就不能调用self(这是类本身)。但是,在您的情况下,这应该不是问题,因为您已经定义了根类。对于你的第一堂课,请实现这样的代码,它应该可以工作。

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
    }

}

}

对于第二个类,你需要做一个类似的事情,这意味着在else语句中给单词一个值,它应该没问题。