2016-10-27 8 views
0

サブクラスがOutputStreamです。私は2つのinit()メソッドを持っていますが、接頭辞はconvenienceです。ここでswiftでsuper.initコールの前に 'self'が使用されています。

は私のコードです:

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) 
    } 
} 

私はエラー

私は

を書くことで試してみましたでsuper.initコール

前に使用 '自己' を取得しています

super.init() 
0最初の方法においてのみ第二の方法における方法
  • の終わりに方法
  • の開始時に、両方の方法で

    ただし、まだエラーが発生しています。誰か知っているなら、私を助けてください。

  • 答えて

    2

    init?(filepath f:URL)メソッドの最後にsuper.init(url: f, append: false/true)を使用してください。

    あなたの初期化子がOutputStreamクラスで利用可能で、これらのinitメソッドのいずれか...答えを

    public init(toMemory:()) 
    public init(toBuffer buffer: UnsafeMutablePointer<UInt8>, capacity: Int) 
    @available(iOS 4.0, *) 
    public init?(url: URL, append shouldAppend: Bool) 
    
    +0

    おかげスーパーclass..Callの指定された初期化子を呼び出す必要があります – VRAwesome

    関連する問題