Swift ui mac os extension delegate view is possible

Viewed 82

I have the following code, which clicking on the button allows me to clone a repository that is on github.

import SwiftUI
import Git

struct File: View {
    @State var pathUrl = "https://github.com/way-to-code/git-macOS.git"
    @State var nameDir = "/Users/"
    
    func cloneReport() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            let url: URL = URL(string: pathUrl)!
            let report = GitRepository(from: url)
            //report.delegate = progressTracker
            do {
                try report.clone(at: nameDir)
            } catch let e {
                print("Errors \(e).")
            }
        }
    }
    
    var body: some View {
        Button(action: {
            cloneReport()
        }) {
            Text("Clone").frame(width: 330)
        }
    }
}

struct File_Previews: PreviewProvider {
    static var previews: some View {
        File()
    }
}

I am using the following framework that tells me if I want to implement the delegate of the framework protocol for track events, I have to do this:

let progressTracker = MyCustomObject()

let repository: GitRepository
repository.delegate = progressTracker

// implement RepositoryDelegate protocol in order to track the events
extension MyCustomObject: RepositoryDelegate {
 func repository(_ repository: Repository, didProgressClone progress: String) {
 }
}

I can't do extension of a class that doesn't exist gives me the following error: Cannot find type 'MyCustomObject' in scope

is it possible to extend a struct of type View?

Can you give me some advice?

1 Answers

An example, the author saying to create or use MyCustomObject class for delegates.

You have to create one class for tracking.

First, create one class same as MyCustomObject

class ProgressTracker: RepositoryDelegate {
    func repository(_ repository: Repository, didProgressClone progress: String) {
        print(progress) // Here you will get progress
    }
}

And configure inside the view

struct File: View {
    @State var pathUrl = "https://github.com/way-to-code/git-macOS.git"
    @State var nameDir = "/Users/"
    
    let progressTracker = ProgressTracker()  // << === Here
    
    func cloneReport() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            let url: URL = URL(string: pathUrl)!
            let report = GitRepository(from: url)
            report.delegate = progressTracker // << === Here
            
            do {
                try report.clone(at: nameDir)
            } catch let e {
                print("Errors \(e).")
            }
        }
    }


If you want your progress inside the File View you can set up your view like this.

struct File: View {
    @State var pathUrl = "https://github.com/way-to-code/git-macOS.git"
    @State var nameDir = "/Users/"
    
    var progressTracker = ProgressTracker()  // << === Here
    
    func cloneReport() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            let url: URL = URL(string: pathUrl)!
            let report = GitRepository(from: url)
            report.delegate = progressTracker // << === Here
            
            progressTracker.progressBlock = { progress in // << === Here
                print(progress)
            }
            
            do {
                try report.clone(at: nameDir)
            } catch let e {
                print("Errors \(e).")
            }
        }
    }
    
    var body: some View {
        Button(action: {
            cloneReport()
        }) {
            Text("Clone").frame(width: 330)
        }
    }
}

// implement RepositoryDelegate protocol in order to track the events
class ProgressTracker: RepositoryDelegate {
    lazy var progressBlock: ((String) -> Void)? = nil
    
    func repository(_ repository: Repository, didProgressClone progress: String) {
        self.progressBlock?(progress)
    }
}
Related