在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())
抢马约夫

更新

从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而没有执行其他操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章