Хобрук: Ваш путь к мастерству в программировании

'self' используется перед вызовом super.init в swift 3.0

У меня есть подкласс OutputStream. В этом у меня есть два метода init(), один из которых имеет префиксное слово convenience.

Вот мой код:

class FileOutputStream : OutputStream
{
      fileprivate let filepath:URL
      fileprivate let channel:DispatchIO!

      convenience init?(filename:String) {

           let pathURL = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in:.userDomainMask).first!.appendingPathComponent(filename)
           self.init(filepath:pathURL)
      }

      init?(filepath f:URL) {

           self.filepath = f

           //if let path = f.path,
           if let cpath = (f.path).cString(using: String.Encoding.utf8) {

                let outputflag:Int32 = O_CREAT | O_WRONLY               // create, write-only
                let mode:mode_t = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH // permissions: u+rw, g+r, o+r
                self.channel = DispatchIO(type: DispatchIO.StreamType.stream, path:cpath, oflag:outputflag,mode: mode, queue: DispatchQueue.global(qos: DispatchQoS.QoSClass.background)) { (errcode:Int32) -> Void in

                     if errcode != 0 {
                          print("FileOutputStream: error creating io channel")
                     }
                 }
            }
            else {
               self.channel = nil
               return nil
            }
    }

    func write(_ string: String) {

        if let dataString = string.data(using: String.Encoding.utf8) {

            dataString.withUnsafeBytes {(bytes: UnsafePointer<UInt8>) -> Void in

                var data = DispatchData.empty
                data.append(bytes, count: dataString.count)

                    self.channel.write(offset: 0, data: data, queue: DispatchQueue.global(qos:.background), ioHandler: { (complete: Bool, data: DispatchData?, errorCode: Int32) in

                        //handle progress reporting here
                         if errorCode != 0 {
                            print("FileOutputStream: error writing data to channel")
                        }
                    })
                }
            }
        }

    deinit {

        self.channel.close(flags: DispatchIO.CloseFlags.stop)
    }
}

я получаю сообщение об ошибке

"self" используется перед вызовом super.init

Я пробовал, написав

super.init() 
  • в обоих методах, при запуске методов
  • в конце методов
  • только во втором способе
  • только в первом способе.

Но все еще получаю ошибку. Если кто-нибудь знает, пожалуйста, помогите мне.


Ответы:


1

Используйте super.init(url: f, append: false/true) в конце метода init?(filepath f:URL) .

Ваш инициализатор должен вызывать назначенный инициализатор суперкласса. Вызовите любой из этих методов инициализации, доступных в классе OutputStream...

public init(toMemory: ())
public init(toBuffer buffer: UnsafeMutablePointer<UInt8>, capacity: Int)
@available(iOS 4.0, *)
public init?(url: URL, append shouldAppend: Bool)
27.10.2016
Новые материалы

Введение в контекст React
В этом посте мы поговорим о Context API, который был представлен в React 16, и о том, как вы можете их использовать. Что такое контекст? Глядя на определение из react docs , оно..

Шлюз с лицензией OSS, совместимый с Apollo Federation v2, появится в WunderGraph
Сегодня мы рады сообщить, что мы сотрудничаем с поддерживаемой YC Tailor Technologies, Inc. для внедрения Apollo Federation v2. Реализация будет лицензирована MIT (Engine) и Apache 2.0..

Это оно
Ну, я официально уволился с работы! На этой неделе я буду лихорадочно выполнять последние требования Думающего , чтобы я мог сосредоточиться на поиске работы. Что именно это значит?..

7 полезных библиотек JavaScript, которые вы должны использовать в своем следующем проекте
Усильте свою разработку JavaScript Есть поговорка «Не нужно изобретать велосипед». Библиотеки — лучший тому пример. Это поможет вам написать сложные и трудоемкие функции простым способом...

Базовое руководство по переносу концепций обучения в глубокое обучение
Обзор По мере того, как машинное обучение становится все более мощным и продвинутым, модели, обеспечивающие эту расширенную возможность, становятся все больше и начинают требовать огромного..

C в C.R.U.D с использованием React-Redux
Если вы использовали React, возможно, вы знакомы с головной болью, связанной с обратным потоком данных. Передача состояния реквизитам от родительских компонентов к дочерним компонентам может..

5 обязательных элементов современного инструмента конвейера данных
В цифровом мире предприятия используют конвейеры данных для перемещения, преобразования и хранения огромных объемов данных. Эти конвейеры составляют основу бизнес-аналитики и играют..