调用@Environment 时收到错误“类‘环境’不能用作属性”

Ris*_*ari 9 swift swiftui

我正在尝试在 SwiftUI 中包含带有自定义字体的动态类型,并且当我尝试获取环境的sizeCategory.

我试过使用@Environment 来获取除 之外的对象sizeCategory,但它不断抛出相同的错误。

我在 Xcode 11 beta 5 上使用了这篇StackOverflow 帖子中的代码的修改。它似乎适用于那里的其他人,所以我真的很困惑为什么它对我不起作用。

struct RawlineFont: ViewModifier {
  var textStyle: Font.TextStyle

  @Environment(\.sizeCategory) var sizeCategory : ContentSizeCategory

  init(_ textStyle: Font.TextStyle = .body) {
    self.textStyle = textStyle
  }

  func body(content: Content) -> some View {
    content.font(getFont())
  }

  func getFont() -> Font {
    switch(self.sizeCategory) {
    case .extraSmall:
      return Font.custom("Rawline", size: 16 * getStyleFactor())
    case .small:
      return Font.custom("Rawline", size: 21 * getStyleFactor())
    case .medium:
      return Font.custom("Rawline", size: 24 * getStyleFactor())
    case .large:
      return Font.custom("Rawline", size: 28 * getStyleFactor())
    case .extraLarge:
      return Font.custom("Rawline", size: 32 * getStyleFactor())
    case .extraExtraLarge:
      return Font.custom("Rawline", size: 36 * getStyleFactor())
    case .extraExtraExtraLarge:
      return Font.custom("Rawline", size: 40 * getStyleFactor())
    case .accessibilityMedium:
      return Font.custom("Rawline", size: 48 * getStyleFactor())
    case .accessibilityLarge:
      return Font.custom("Rawline", size: 52 * getStyleFactor())
    case .accessibilityExtraLarge:
      return Font.custom("Rawline", size: 60 * getStyleFactor())
    case .accessibilityExtraExtraLarge:
      return Font.custom("Rawline", size: 66 * getStyleFactor())
    case .accessibilityExtraExtraExtraLarge:
      return Font.custom("Rawline", size: 72 * getStyleFactor())
    @unknown default:
      return Font.custom("Rawline", size: 36 * getStyleFactor())
    }
  }

  func getStyleFactor() -> CGFloat {
    switch textStyle {
    case .caption:
      return 0.6
    case .footnote:
      return 0.7
    case .subheadline:
      return 0.8
    case .callout:
      return 0.9
    case .body:
      return 1.0
    case .headline:
      return 1.2
    case .title:
      return 1.5
    case .largeTitle:
      return 2.0
    @unknown default:
      return 1.0
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

错误信息

完整的代码文件:

//
//  Fonts.swift
//  Team Study
//
//  Created by Aditya Chugh on 2019-07-02.
//  Copyright © 2019 Aditya Chugh. All rights reserved.
//

import SwiftUI

class Rawline {

  static let extraLight = "RawlineExtraLight-Regular"
  static let extraLightItalic = "RawlineExtraLight-Italic"

  static let light = "RawlineLight-Regular"
  static let lightItalic = "RawlineLight-Italic"

  static let thin = "RawlineThin-Regular"
  static let thinItalic = "Rawline-ThinItalic"

  static let regular = "Rawline-Regular"
  static let italic = "Rawline-Italic"

  static let medium = "RawlineMedium-Regular"
  static let mediumItalic = "RawlineMedium-Italic"

  static let semiBold = "RawlineSemiBold-Regular"
  static let semiBoldItalic = "RawlineSemiBold-Italic"

  static let bold = "Rawline-Bold"
  static let boldItalic = "Rawline-BoldItalic"

  static let extraBold = "RawlineExtraBold-Regular"
  static let extraBoldItalic = "RawlineExtraBold-Italic"

  static let black = "RawlineBlack-Regular"
  static let blackItalic = "RawlineBlack-Italic"

}

struct RawlineFont: ViewModifier {
  var textStyle: Font.TextStyle

  @Environment(\.sizeCategory) var sizeCategory : ContentSizeCategory

  init(_ textStyle: Font.TextStyle = .body) {
    self.textStyle = textStyle
  }

  func body(content: Content) -> some View {
    content.font(getFont())
  }

  func getFont() -> Font {
    switch(self.sizeCategory) {
    case .extraSmall:
      return Font.custom("Rawline", size: 16 * getStyleFactor())
    case .small:
      return Font.custom("Rawline", size: 21 * getStyleFactor())
    case .medium:
      return Font.custom("Rawline", size: 24 * getStyleFactor())
    case .large:
      return Font.custom("Rawline", size: 28 * getStyleFactor())
    case .extraLarge:
      return Font.custom("Rawline", size: 32 * getStyleFactor())
    case .extraExtraLarge:
      return Font.custom("Rawline", size: 36 * getStyleFactor())
    case .extraExtraExtraLarge:
      return Font.custom("Rawline", size: 40 * getStyleFactor())
    case .accessibilityMedium:
      return Font.custom("Rawline", size: 48 * getStyleFactor())
    case .accessibilityLarge:
      return Font.custom("Rawline", size: 52 * getStyleFactor())
    case .accessibilityExtraLarge:
      return Font.custom("Rawline", size: 60 * getStyleFactor())
    case .accessibilityExtraExtraLarge:
      return Font.custom("Rawline", size: 66 * getStyleFactor())
    case .accessibilityExtraExtraExtraLarge:
      return Font.custom("Rawline", size: 72 * getStyleFactor())
    @unknown default:
      return Font.custom("Rawline", size: 36 * getStyleFactor())
    }
  }

  func getStyleFactor() -> CGFloat {
    switch textStyle {
    case .caption:
      return 0.6
    case .footnote:
      return 0.7
    case .subheadline:
      return 0.8
    case .callout:
      return 0.9
    case .body:
      return 1.0
    case .headline:
      return 1.2
    case .title:
      return 1.5
    case .largeTitle:
      return 2.0
    @unknown default:
      return 1.0
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

小智 44

我有同样的错误信息。事实证明,我定义了另一个名为 Environment 的类型,编译器正在使用它。

这对我有用: @SwiftUI.Environment(\.colorScheme) var colorScheme : ColorScheme

希望这对你有帮助


H K*_*H K 12

如果您的应用程序中有另一个名为 的对象,那么它将与的环境关键字Environment发生冲突。更改自定义对象SwiftUI的名称Environment