面试题答案
一键面试架构思路
- 协议驱动设计:
- 定义一系列协议来抽象不同数据模型的通用行为。例如,定义一个
Displayable
协议,用于描述数据模型如何在视图中显示。 - 这样不同的数据模型可以遵循这个协议,从而在泛型视图中进行统一处理。
- 定义一系列协议来抽象不同数据模型的通用行为。例如,定义一个
- 泛型视图封装:
- 创建泛型视图,这些视图接受遵循特定协议的类型作为参数。例如,创建一个
GenericContentView
,它可以接受任何遵循Displayable
协议的数据模型实例,并根据协议中定义的规则进行显示。
- 创建泛型视图,这些视图接受遵循特定协议的类型作为参数。例如,创建一个
- 依赖注入:
- 在需要动态类型的地方,通过依赖注入的方式传入具体的类型实例。这使得代码更加灵活,易于测试和维护。
- 分层架构:
- 分为数据层、业务逻辑层和视图层。数据层负责数据的获取和持久化;业务逻辑层处理数据的转换和处理,确保数据符合
Displayable
协议等规则;视图层通过泛型视图展示数据。
- 分为数据层、业务逻辑层和视图层。数据层负责数据的获取和持久化;业务逻辑层处理数据的转换和处理,确保数据符合
关键代码片段
- 定义协议:
protocol Displayable {
var displayTitle: String { get }
var displayDescription: String { get }
}
- 数据模型遵循协议:
struct User: Displayable {
let name: String
let bio: String
var displayTitle: String {
return name
}
var displayDescription: String {
return bio
}
}
- 泛型视图:
struct GenericContentView<T: Displayable>: View {
let item: T
var body: some View {
VStack {
Text(item.displayTitle)
.font(.headline)
Text(item.displayDescription)
.font(.subheadline)
}
}
}
- 使用泛型视图:
struct ContentView: View {
let user = User(name: "John Doe", bio: "A software engineer")
var body: some View {
GenericContentView(item: user)
}
}
- 依赖注入示例(在视图模型中):
class ViewModel {
var displayableItem: Displayable?
init(displayable: Displayable?) {
self.displayableItem = displayable
}
}
在视图中使用这个视图模型:
struct AnotherContentView: View {
let viewModel: ViewModel
var body: some View {
if let item = viewModel.displayableItem {
GenericContentView(item: item)
}
}
}
然后可以这样创建视图:
let user = User(name: "Jane Smith", bio: "A designer")
let viewModel = ViewModel(displayable: user)
AnotherContentView(viewModel: viewModel)