Протоколы в Swift - PullRequest
       5

Протоколы в Swift

0 голосов
/ 09 октября 2019

Я хочу создать FileManager с использованием протоколов в Swift.

Это просто структура

struct AppFile: AppFileManipulation {

    let fileName: String

    init(fileName: String)
    {
        self.fileName = fileName
    }

}

, которая теперь создается в коде

let file = AppFile(fileName: "testfile.txt")

Я хочу разделить разные функции на разные протоколы

Один из них дает статус файла, здесь он с файлом существует

protocol AppFileStatus
{
    func exists(file at: URL) -> Bool
}

extension AppFileStatus
{
    func exists(file at: URL) -> Bool
    {
        return FileManager.default.fileExists(atPath: at.path)
    }
}

и я хочу иметь отдельный протокол, которыйимеет файловые операции

protocol AppFileManipulation : AppDirectoryNames, AppFileStatus
{
    func writeStringsToFile(containing: String, to path: FileManager.SearchPathDirectory, withName name: String) -> Bool
}

extension AppFileManipulation
{
        func writeStringsToFile(containing: String, to path: FileManager.SearchPathDirectory, withName name: String) -> Bool{

}
    }

Теперь по разным причинам (чтобы проверить, существует ли файл на самом деле), я хочу, чтобы тело writeStringsToFile было доступно (файл по адресу: URL).

OneРешение было бы поместить все в один протокол, но на самом деле я хотел разделить функциональность. Другой вариант - повторить код.

Как мне структурировать это так, чтобы я мог получить доступ к методам AppFileStatus из протокола AppFileManipulation?

Вот пример проекта;https://github.com/stevencurtis/ProtocolFileHandling

1 Ответ

0 голосов
/ 09 октября 2019

Возможно, вы искали опцию where Self для вашего добавочного номера:

struct AppFile: AppFileStatus, AppFileManipulation {

    let fileName: String

    init(fileName: String)
    {
        self.fileName = fileName
    }
}


protocol AppFileStatus
{
    func exists(file at: URL) -> Bool
}


extension AppFileStatus
{
    func exists(file at: URL) -> Bool
    {
        return FileManager.default.fileExists(atPath: at.path)
    }
}


protocol AppFileManipulation
{
    func writeStringsToFile(containing: String, to path: FileManager.SearchPathDirectory, withName name: String) -> Bool
}


extension AppFileManipulation where Self: AppFileStatus
{
    func writeStringsToFile(containing: String, to path: FileManager.SearchPathDirectory, withName name: String) -> Bool{
            let exists = self.exists(file: URL(fileURLWithPath: ""))

            return true
    }
}

, и теперь вы можете позвонить:

let file = AppFile(fileName: "testfile.txt")
file.writeStringsToFile(containing: ..., to: ..., withName: ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...