写了80余篇SwiftUI相关的文章,总算对SwiftUI有初步了解。因而想本身是否可以也写个开源项目,让本身代码也能够复用。
须要用到Swift语言的高级特性Generics(范型)。Generics能够让咱们的项目变得灵活,避免重复编写相同的代码,并以清晰抽象的方式提供代码表达力。数据结构
U.init(item: item.getShowDict())
U是一个范型,经过协议实现了init,经过where明确了U是个Viewide
protocol PageModelProtocal:Identifiable{ associatedtype T static func row_page() ->[T] // 获取下一页 var id:UUID { get set } var name:String { get set } func next() ->[T] func getShowDict() ->[String:Any] }
能够用associatedtype来解决spa
import SwiftUI struct ContentView: View { var body: some View { ListPageViewG<Author,AuthorPageRow2>() // ListPageViewG<Author,AuthorPageRow>() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
咱们经过范型ListPageViewG能够自由控制显示数据结构和效果code
struct ListPageViewG<T:PageModelProtocal,U:PageRowProtocal>: View where U:View
例如设置一下基础效果blog
struct ListPageViewG<T:PageModelProtocal,U:PageRowProtocal>: View where U:View
还能够设置一下复杂效果教程
ListPageViewG<Author,AuthorPageRow2>()
struct ListPageViewG<T:PageModelProtocal,U:PageRowProtocal>: View where U:View{ var pageMgr:PageMgrG<T> = PageMgrG<T>() @State var items:[T] = [] @State var isLoading: Bool = false @State var page: Int = 0 init() { _items = State(initialValue: pageMgr.next()) } var body: some View { List(items){ item in //self.pageRow VStack{ U.init(item: item.getShowDict()) }.onAppear { // self.myInit() self.listItemAppears(item) } } } }
protocol PageRowProtocal { var item:[String:Any] { get set } init(item:[String:Any]) } protocol PageModelProtocal:Identifiable{ associatedtype T static func row_page() ->[T] // 获取下一页 var id:UUID { get set } var name:String { get set } func next() ->[T] func getShowDict() ->[String:Any] } class PageMgrG<T:PageModelProtocal>:NSObject{ var page = 0 var pageSize = 0 func next() -> [T]{ return T.row_page() as! [T] } }
// 遵照协议的struct struct Author:PageModelProtocal { var id = UUID() var name = "" func getShowDict() ->[String:Any]{ return ["id":id,"name":name] } func next() -> [Self] { return Author.row_page() } static func row_page() ->[Self]{ return [ Author(name:"tom"), Author(name:"jack"), Author(name:"mary") ] } }
import SwiftUI struct AuthorPageRow: View ,PageRowProtocal{ var item:[String:Any] var body: some View { Text("\(item["id"] as! UUID) \(item["name"] as! String)") } } struct AuthorPageRow2: View ,PageRowProtocal{ var item:[String:Any] var body: some View { CircleText(name: item["name"] as! String) } }