尽管在类中声明了变量,但无法在范围内找到

Posted

技术标签:

【中文标题】尽管在类中声明了变量,但无法在范围内找到【英文标题】:Cannot Find In Scope Despite Variable Declared In Class 【发布时间】:2021-06-12 04:36:34 【问题描述】:

我正在使用 Swift 在 Xcode 上编写一个基本的 fps 应用程序。错误出现在我的 Bitmap.swift 文件中,该文件旨在将像素存储在 2D 数组中,以便可以在应用程序中表示整个图像。

代码如下:

import UIKit

class Bitmap: UIViewController 

    public struct Bitmap
    
        public private(set) var pixels: [Color]
        public let width: Int
        
        public init(width: Int, pixels: [Color])
        
            self.width = width
            self.pixels = pixels
        
    
    
    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    
    */




extension Bitmap

    var height: Int
    
        return pixels.count / width
    
    subscript(x: Int, y: Int) -> Color
    
        get  return pixels[y * width + x] 
        set  pixels[y * width + x] = newValue
    
    convenience init(width: Int, height: Int, color: Color) 
        self.pixels = Array(repeating: color, count: width * height)
        self.width = width
    

尽管在我的类中声明了“像素”和“宽度”,但我的扩展函数仍然收到这些错误:

“在范围内找不到‘像素’” “在范围内找不到‘宽度’” “‘位图’类型的值没有成员‘像素’” "'Bitmap' 类型的值没有成员 'width'"

编辑:这是我的另一个文件“Color.swift”的代码

import UIKit

class Color: UIViewController 
    
    public struct Color 
        public var r, g, b, a: UInt8
        
        public init(r: UInt8, g: UInt8, b: UInt8, a: UInt8 = 255)
        
            self.r = r
            self.g = g
            self.b = b
            self.a = a
        
    


    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    
    */




extension Color 
    static let clear = Color(r: 0, g: 0, b: 0, a: 0)
    static let black = Color(r: 0, g: 0, b: 0)
    static let white = Color(r: 255, g: 255, b: 255)
    static let gray = Color(r: 192, g: 192, b: 192)
    static let red = Color(r: 255, g: 0, b: 0)
    static let green = Color(r: 0, g: 255, b: 0)
    static let blue = Color(r: 0, g: 0, b: 255)

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您同时拥有一个class 一个名为Bitmapstruct。我猜class 是错误的,因为你描述了你打算如何使用它。

去掉struct周围的class,去掉conveniencestructs没有用到:

public struct Bitmap

    public private(set) var pixels: [Color]
    public let width: Int
    
    public init(width: Int, pixels: [Color])
    
        self.width = width
        self.pixels = pixels
    



extension Bitmap

    var height: Int
    
        return pixels.count / width
    
    subscript(x: Int, y: Int) -> Color
    
        get  return pixels[y * width + x] 
        set  pixels[y * width + x] = newValue
    
    init(width: Int, height: Int, color: Color) 
        self.pixels = Array(repeating: color, count: width * height)
        self.width = width
    

【讨论】:

Bitmap 作为一个整体意味着是一种表示整个图像的类型,扩展函数意味着作为图像高度的计算属性,以及用于创建空图像的便利初始化程序.删除类不会使其余代码无用,因为它无法在范围内找到位图吗? @Hegazy1738 删除类与Bitmap 是否在范围内无关(实际上,几乎相反,因为您之前因隐藏名称而出错)。也许你的意思是别的?您认为它应该是UIViewController 有什么原因吗?我提供的代码编译得很好,并且似乎符合您在问题 您的评论中的描述。你试过了吗? 是的,我做到了,在复制和粘贴您的代码后,我仍然遇到同样的错误。无论我把公共结构函数放在哪里(因为扩展必须在类之外,不能在里面)它总是给我同样的错误。 我给你的代码编译得很好。复制到一个空白项目中,您将能够看到它。我担心你说“扩展必须在课堂之外”——在我的例子中没有更多的课堂。可能的问题:1)您需要清理和重建您的项目 2)您的项目中有其他代码(可能是 Bitmap 的另一个声明?)影响此问题未包含在您的问题中。 现在一切正常。非常感谢!我真的很感激。

以上是关于尽管在类中声明了变量,但无法在范围内找到的主要内容,如果未能解决你的问题,请参考以下文章

Python 类中的变量范围

在类范围内声明一个与类属性同名的局部变量

iOS中OC面试题整理

类中声明的变量的内存分配

Chrome开发工具:监视变量不可用(无法在封闭范围内检测到)[重复]

类中的 2D 矢量调整大小。在此范围内未声明错误[关闭]