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

Posted

技术标签:

【中文标题】调用 @Environment 时收到错误“类 \'Environment\' 不能用作属性”【英文标题】:Error "Class 'Environment' cannot be used as an attribute" received when @Environment is called调用 @Environment 时收到错误“类 'Environment' 不能用作属性” 【发布时间】:2019-08-06 14:49:40 【问题描述】:

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

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

我正在使用 Xcode 11 beta 5 上 this*** 帖子中的代码修改。它似乎适用于那里的其他所有人,所以我真的很困惑为什么它不适合我。

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
    
  


【问题讨论】:

【参考方案1】:

我收到了同样的错误信息。事实证明,我已经定义了另一个名为 Environment 的类型,编译器正在接受它。

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

希望对你有帮助

【讨论】:

隐秘的编译器消息在这里真的很有帮助。我几乎更喜欢 Objc 没有命名空间。【参考方案2】:

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

【讨论】:

以上是关于调用 @Environment 时收到错误“类 'Environment' 不能用作属性”的主要内容,如果未能解决你的问题,请参考以下文章

实施 FCM 时没有为应用程序错误找到有效的“aps-environment”权利字符串

PowerShell直接调用.net静态类和方法

运行rails应用程序时出现webpacker错误。 'TypeError:environment.plugins.set不是函数'

如何在 GWT 中为 AppEngine SystemProperty 继承模块

为啥我在函数内部调用时会收到“错误:无效的挂钩调用”?

在类函数中调用 Alamofire 时出错