在SwiftUI中,.modifier和.layout有什么区别

时间:2019-06-19 16:55:37

标签: swiftui

使用 .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())

1 个答案:

答案 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)
    }
}

由于modifierlayout都被声明为@inlinable,因此Swift在.swiftinterface文件中包含了函数体。我们可以看到layout只是调用modifier而没有执行其他操作。