我有一个概念性的Animal API客户端类,它将与下面的Rest Api连接(它可能有语法错误,我正在从头脑中输入它)。
class AnimalApi {
let connectionInfo: ApiConnectionInfo
init(connectionInfo: ApiConnectionInfo) {
self.connectionInfo = connectionInfo
}
func login(username: String, password: String) {
// login stuff
}
func logout() {
// logout stuff
}
func get(url: String) {
}
func post(url: String) {
}
func delete(url: String) {
}
}
// Dogs
extension AnimalApi {
func getAllDogs() -> Dogs {
return get("dogResourceUrl")
}
func deleteDog() { }
func updateDog() { }
}
// Cats
extension AnimalApi {
func getAllCats() { }
func deleteCat() { }
func updateCat() { }
}
有没有更好的方法在Swift中分组代码而不是使用扩展?我必须调用的许多API资源都位于同一个API服务器上。我试图避免以下......
let api = AnimalApi()
let dogs = api. // bombarded with all functions here, ideally something like api.Dogs.getAll would be more manageable
我意识到Apple使用扩展程序将他们的代码分组到他们的Swift API中,但是有更好的方法吗?子类可能吗?
编辑:如果可能,我想避免使用子类。这是因为我计划拥有AnimalApi的单个全局实例,因为它将在整个应用程序中不断访问。也许使AnimalAPi成员是静态的,并且具有包含调用静态AnimalApi的函数的静态成员的单独类。class DogApi {
class func all() { return AnimalApi.get("dogResourceUri") }
}
let dogs = DogApi.all()
答案 0 :(得分:1)
以下示例代码是尝试完成您的要求。 希望它有所帮助。
typealias Task = () -> ()
typealias Api = (getAll: Task, delete: Task, update: Task)
class AnimalApi {
let dogs: Api = {
func getAll() { }
func delete() { }
func update() { }
return (getAll, delete, update)
}()
let cats: Api = {
func getAll() { }
func delete() { }
func update() { }
return (getAll, delete, update)
}()
}
现在,您可以在应用程序的任何位置使用它,而不会受到所有不同功能的轰炸:
let api = AnimalApi()
let dogs = api.dogs.getAll