Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将项目从swift3迁移到swift4无法覆盖初始化_Swift - Fatal编程技术网

将项目从swift3迁移到swift4无法覆盖初始化

将项目从swift3迁移到swift4无法覆盖初始化,swift,Swift,我试图在我的DatabaseHelper中重写init,但不知怎的。我在super.init调用中得到一个错误属性'self.dateFormatter'未初始化我没有得到我在这里做错的地方 public override init() { super.init() //I am getting error here dateFormatter.dateFormat = "yyyyMMdd HHmmss"; do { db

我试图在我的DatabaseHelper中重写init,但不知怎的。我在super.init调用中得到一个错误
属性'self.dateFormatter'未初始化
我没有得到我在这里做错的地方

public override init() {
        super.init()  //I am getting error here
        dateFormatter.dateFormat = "yyyyMMdd HHmmss";
        do {
            db = try Connection(dbPath);


            try db!.run(FormTbl.create(temporary: false, ifNotExists: true) { t in
                t.column(self.ColumnId, primaryKey:true);
                t.column(self.FileName);
                t.column(self.ReceivedDate);
                t.column(self.SentDate);
                t.column(self.Status);
                t.column(self.AwaitingStatus);
                });
            try db!.run(SettingTbl.create(temporary: false, ifNotExists:true) {t in
                t.column(self.ColumnId, primaryKey:true);
                t.column(self.SettingName, unique: true);
                t.column(self.SettingValue);
                });
            try db!.run(PhotoTbl.create(temporary: false, ifNotExists:true) {t in
                t.column(self.ColumnId, primaryKey:true);
                t.column(self.PhotoFormId);
                t.column(self.FileName);
                t.column(self.PhotoSentFileName);
                t.column(self.ReceivedDate);
                t.column(self.SentDate);
                t.column(self.Status);
                });
            try db!.run(GpsTbl.create(temporary: false, ifNotExists:true) {t in
                t.column(self.ColumnId, primaryKey: true);
                t.column(self.GpsFormId);
                t.column(self.Longitude);
                t.column(self.Latitude);
                t.column(self.Altitude);
                t.column(self.DateTime);
                });
        } catch {

        }
    }

注意:我正在尝试将我的项目从swift3迁移到swift4.2

我的完整源代码如下:


我真的被困在这里一天了!谁能帮我一下我做错了什么!!任何建议都会大有帮助!提前感谢

您收到了该错误,因为您的
日期格式化程序
变量未在类中初始化。您必须在完成
init
初始值设定项之前初始化所有变量,否则编译器会因为安全原因而抱怨

在代码中,您声明了以下内容:
private let dateFormatter:dateFormatter

但这只是一个没有价值的常数。未指向
DateFormatter
类。你还没有初始化它。为了初始化它,您必须为它分配一个
DateFormatter()
,例如,在同一行中:
private let dateFormatter=dateFormatter()


通过在
init
方法中添加
dateFormatter=dateFormatter()
,您也应该能够在
init
方法中初始化它,但是您需要将
let
替换为
var

该代码甚至不能在Swift 3中编译

由于
dateFormatter
是类中已声明但未初始化的属性,因此必须在调用
super
之前对其进行初始化

public override init() {
    dateFormatter = DateFormatter()
    super.init()
    dateFormatter.dateFormat = "yyyyMMdd HHmmss"
并删除感叹号,dateFormatter应该是非可选的

private let dateFormatter : DateFormatter

除此之外,代码中还有三种错误做法

  • 这是斯威夫特。没有尾随分号
  • 请遵守命名约定,这一行很容易混淆

    public var DateFormatter : DateFormatter {
    
    • 所有结构、类和枚举都以大写字母开头
    • 所有变量、函数和枚举案例都以小写字母开头
  • 共享实例的创建是客观的,并且自Swift 2以来已经过时


  • 您的dateFormatter未在父类中初始化。添加一个
    dateFormatter=dateFormatter()
    ,到此为止。很抱歉,我对这一点不太熟悉。你能详细说明一下吗!!我在同一行中遇到错误,因为
    无法在属性初始值设定项中使用实例成员“DateFormatter”;属性初始值设定项在“self”可用之前运行
    我收到一个错误
    无法按照建议调用非函数类型“DateFormatter”的值
    如果我删除括号,我收到一个错误
    在“super.init”调用之前的属性访问“DateFormatter”中使用的“self”
    !这是别人写的非常古老的代码!!尽管我是斯威夫特的新手!但是我知道一些基本的删除了可怕的属性
    public-var-DateFormatter:DateFormatter{
    或者重命名它。这就是为什么大写/小写命名如此重要的原因。