首页 > 解决方案 > 在 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())

标签: swiftui

解决方案


更新

从 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做其他任何事情。


推荐阅读