在 SwiftUI 中,.modifier 和 .layout 有什么区别
In SwiftUI, what's the difference between .modifier and .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
而没有做任何其他事情。
我似乎找不到使用 .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
而没有做任何其他事情。