使用 .modifier 或 .layout 应用ViewModifier似乎没有什么区别。它们都产生相同的结果。任何人都知道这两者之间有什么区别。没有任何文档。
例如,给定此修饰符:
tableView.moveRow(at: oldIndexPath, to: newIndexPath)
这两个视图看起来完全相同:
struct RedTitle: ViewModifier {
func body(content: Content) -> some View {
return content.foregroundColor(.red).font(.title)
}
}
Text("Hello world!").layout(RedTitle())
答案 0 :(得分:2)
从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
可能是较旧的设计遗留下来的,需要将其删除,否则更高的beta可能会使它的行为有所不同。
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
而没有执行其他操作。