当我从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的逻辑,我该如何正确修复它呢?
感谢您帮助我。
答案 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语句中给单词一个值,它应该没问题。