在 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)
    }
}

因为 modifierlayout 都声明为 @inlinable,Swift 将函数体包含在 .swiftinterface 文件中。我们可以看到 layout 只是调用了 modifier 而没有做任何其他事情。