swiftui - 在 SwiftUI 中,.modifier 和 .layout 有什么区别
问题描述
我似乎找不到使用.modifier或.layout应用 ViewModifier 之间的任何区别。它们都产生相同的结果。任何人都知道这两者之间有什么区别。没有任何文档。
例如,给定这个修饰符:
struct RedTitle: ViewModifier {
func body(content: Content) -> some View {
return content.foregroundColor(.red).font(.title)
}
}
这两个视图看起来相同:
Text("Hello world!").layout(RedTitle())
Text("Hello world!").modifier(RedTitle())
解决方案
更新
从 Xcode 11 beta 4 开始,该layout
修饰符已被标记为已弃用:
extension View {
@available(*, deprecated, renamed: "modifier")
@inlinable public func layout<T>(_ layout: T) -> some SwiftUI.View where T : SwiftUI.ViewModifier {
return modifier(layout)
}
}
原来的
Xcode 11 beta 2 没有区别。这并不意味着永远没有区别。可能layout
是旧设计遗留下来的,需要删除,或者以后的测试版可能会使其行为不同。
SwiftUI 导出的完整界面可以在这个文件中找到:
/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SwiftUI.framework/Modules/SwiftUI.swiftmodule/arm64.swiftinterface
查看该文件,您可以找到以下声明func modifier
:
extension View {
public typealias Modified<T> = _ModifiedContent<Self, T> where T : SwiftUI.ViewModifier
@inlinable public func modifier<T>(_ modifier: T) -> Modified<T> where T : SwiftUI.ViewModifier {
return .init(content: self, modifier: modifier)
}
}
并声明func layout
:
extension View {
@inlinable public func layout<T>(_ layout: T) -> Modified<T> where T : SwiftUI.ViewModifier {
return modifier(layout)
}
}
因为modifier
和layout
都被声明@inlinable
了,Swift 将函数体包含在.swiftinterface
文件中。我们可以看到它layout
只是调用而不modifier
做其他任何事情。
推荐阅读
- ms-access - 访问运行时错误 3265 在此集合中找不到项目
- rest - 根据 WSO2 突触文件中的 HTTP 方法为 API 配置不同的处理程序
- html - 如何将单个 Google 表格单元格的文本内容嵌入网页?
- python - 如何使用 series.str.contains 函数浏览字符串列表?
- spring-boot - 带有 Spring Boot 的 Docker 映像无法连接到 CloudSQL
- python - 如何获取 asyncio.Cancelled 错误消息?
- google-sheets-api - Update cell Google Sheet API
- javascript - 如何使 div 出现在滚动容器之外?
- kendo-ui - 网格中的 Kendo TimePicker:我如何获得价值?
- javascript - 如何将路由保护添加到 MEVN 堆栈身份验证应用程序