调用@Environment时收到错误“类'Environment'不能用作属性”

时间:2019-08-06 14:49:40

标签: swift swiftui

我正在尝试在SwiftUI中包括带有自定义字体的动态类型,并且当我尝试获取环境的sizeCategory时,会不断调用此错误。

我尝试使用@Environment来获取sizeCategory以外的对象,但是它总是抛出相同的错误。

我正在使用Xcode 11 beta 5上this 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
    }
  }

}

Error message

完整的代码文件:

//
//  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
    }
  }

}

3 个答案:

答案 0 :(得分:3)

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

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

希望这对您有帮助

答案 1 :(得分:0)

我是回答您提到的问题的人。我只是尝试使用Beta 5发布的代码,所以效果很好。但是,请注意,使用SwiftUI,当真正的错误在其他地方时,您可能会在某些地方出现错误。我敢打赌,您的代码其他部分可能会有不平衡的括号。否则可能完全是另一回事。再次检查,如果问题仍然存在,请发布完整代码。

答案 2 :(得分:0)

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