При разработке приложения я использую расширения, чтобы скрыть зависимость от конкретной библиотеки в моем коде.Я хотел бы, чтобы имена методов были точно такими же, как в библиотеке.
Этот подход помогает значительно уменьшить зависимость от внешней библиотеки (чтобы заменить ее другой, мне потребуется только переписать функции вмост).Тем не менее, это немного сложно в случае расширений, так как я получаю бесконечный цикл с этим кодом:
// Library implementation, File1.swift
import Foundation
extension Date {
func test(otherDate: Date) -> String {
return String()
}
}
// App reference to the library, different module, File2.swift
import Foundation
import Library
extension Date {
func test(otherDate: Date) -> String {
// How to reference "Library" here?
return test(otherDate: otherDate)
}
}
При добавлении префикса подход работает отлично:
// Works correctly:
import Foundation
import Library
extension Date {
func prefix_test(otherDate: Date) -> String {
return test(otherDate: otherDate)
}
}
Есть ли способ в Swift вызвать метод расширения из определенного модуля, аналогично выбору класса :
// Selecting a class:
let a = Module1.CustomClass()
let b = Module2.CustomClass()
let date = Date()
// Can I select an extension method?
date.Module1.func1()
date.Module2.func1()
Чем этот вопрос отличается от «дубликата»: В случае функций класса можно сделать:
Module1.Class1.classFunction()
Module2.Class1.classFunction()
В вышеупомянутом случае такой вызов невозможен, поэтому возникает вопрос.