【问题标题】:'Use of Unresolved Identifier' in SwiftSwift 中“使用未解析的标识符”
【发布时间】:2015-05-13 20:08:51
【问题描述】:

所以我一直在制作一个应用程序,并且一切都运行良好。但是今天我像往常一样创建了一个新类,由于某种原因,在这个类中我无法从其他类访问公共/全局变量。所有其他课程都可以,但现在每当我尝试创建一个新课程时,我都做不到。这将如何解决?

我正在使用 Swift 和 Xcode 6。

工薪阶层:

import UIKit
import Foundation
import Parse
import CoreData

var signedIn = true

class ViewController: UIViewController {

新课程:

import UIKit

class NewClass: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        signedIn = false

}

但是在signedIn = false

我得到错误:

使用未解析的标识符“signedIn”

【问题讨论】:

  • 是的,我已经多次删除并重新创建了这个类
  • 请出示您的代码,无论是工作还是不工作。
  • 你能指定你正在使用的 XCode / Swift 的版本吗(如果它是 beta 版)?
  • @Ichamp Xcode 6.1 不是测试版。
  • 这是您的完整代码吗?由于您的缩进,您的 viewDidLoad() 末尾似乎缺少一个花括号 }

标签: ios xcode swift


【解决方案1】:

我在重命名文件后遇到了这个问题。我从 Xcode 中重命名了该文件,但之后 Xcode 在文件中找不到该函数。即使是干净的重建也不能解决问题,但是关闭然后重新打开项目可以使构建工作。

【讨论】:

  • 完全正确,我删除了文件引用,然后再次添加它们。一切正常
【解决方案2】:

这不是直接给你的代码示例,而是大致的错误。我在这里写它,因为谷歌将这个错误指向这个问题,所以它可能对其他开发者有用。


当您向另一个类中的方法添加选择器时,可能会收到此类错误的另一个用例,例如:

private class MockTextFieldTarget {
private(set) var didCallDoneAction = false
    @objc func doneActionHandler() {
        didCallDoneAction = true
    }
}

然后在另一个班级:

final class UITextFieldTests: XCTestCase {
    func testDummyCode() {
        let mockTarget = MockTextFieldTarget()
        UIBarButtonItem(barButtonSystemItem: .cancel, target: mockTarget, action: MockTextFieldTarget.doneActionHandler)
        // ... do something ...
    }
}

如果在最后一行你只是调用#selector(cancelActionHandler) 而不是#selector(MockTextFieldTarget.cancelActionHandler),你会得到

使用未解析的标识符

错误。

【讨论】:

    【解决方案3】:

    我的问题是使用与其中一个 cocoapods 相同的名称来调用我的程序。它引起了冲突。解决方案:创建一个不同名称的程序。

    【讨论】:

      【解决方案4】:

      在我的例子中,我有一个 Object-C 文件,它也在同一个 Target Membership 中。我通过在文件Bridging-Header.h 中添加#import "YourObjectCFileHeader.h" 来修复

      【讨论】:

        【解决方案5】:

        您忘记声明变量。把var放在signedIn = false前面就行了

        【讨论】:

        • 我认为这只是发布代码中的一个错字(以及viewDidLoad 上缺少的右括号。
        【解决方案6】:

        当你忘记导入库时,我也会在 Swift 中使用“未解析的标识符”。例如我有错误:

        我忘记了UIKit

        导入 UIKit

        【讨论】:

        • 导入 AVFoundation
        【解决方案7】:

        我在我的 Objective-Swift 项目中遇到了 Mantle 框架的这个错误。 我尝试的是,

        1. 检查 Bridging-Header.h 文件中是否有导入
        2. Mantle.h 文件中更改 Framework 的 Target Membership,如下图所示。

        在 Private Membership first build the project 之间切换,最终出现错误。 然后为 Mantle.h 文件中出现的所有框架构建具有 Public Membership 的项目,您必须成功。

        这只是Objective-C Swift项目中构建多个框架的错误。

        【讨论】:

          【解决方案8】:

          我犯了一个愚蠢的错误。在更新 cocoapod 工作区中的代码时,我忘记提及该类是公开的或开放的。

          如果在单独的工作区工作,请检查是否有访问权限。

          【讨论】:

            【解决方案9】:

            一个可能的问题是您的新类具有不同的目标或与另一个不同的目标。

            例如,它可能有一个测试目标,而另一个没有。对于这种特定情况,您必须将所有类包含在测试目标中,或者一个都不包含。

            【讨论】:

            • 如果该类位于不同的目标中,请确保将其导入 swift 文件的顶部
            • 呵呵,有问题。我忘了为班级设置目标。 Tnx :)
            • 天哪,我花了几个小时来解决这个问题。如此愚蠢的错误信息。甚至语法错误更好!
            • 是的..它没有设置在测试项目的目标中!!谢谢
            • 我的在,但我只是取消选中然后重新检查,这解决了这个问题,我的自动完成/智能感知又回来了!
            【解决方案10】:

            如果这是关于您创建的类,请确保该类没有嵌套。

            F.e

            A.swift

            class A {
            
               class ARelated {
            
               }
            }
            

            调用var b = ARelated() 将给出“使用未解析的标识符:ARelated”。

            您可以:

            1) 如果需要,可以在同一个文件中分离类:

            A.swift

            class A {
            
            }
            
            class ARelated {
            
            }
            

            2) 保持相同的结构并使用封闭类来获取子类:

            var b = A.ARelated

            【讨论】:

              【解决方案11】:

              对我来说,发生此错误是因为我试图调用 nested 函数。要修复它,我唯一要做的就是将函数 out 带到它可见的范围内。

              【讨论】:

              • “将函数带到可见的范围内”是指将其标记为公开吗?
              • 没有。只是纯粹将函数移动/拖动到不同的范围,即在类的范围内
              【解决方案12】:

              您的NewClass 继承自UIViewController。你在ViewController 中声明了signedIn。如果您希望NewClass 能够识别该变量,则必须在您的NewClass 继承自的类中声明它。

              【讨论】:

                【解决方案13】:

                我看到此错误的另一个地方是您的项目有多个目标多个桥接头 .如果是共享类,请确保将资源添加到所有桥接头。

                一个好的提示是查看左侧的问题导航器面板;根对象将显示发出投诉的目标。

                【讨论】:

                  【解决方案14】:

                  有时编译器会对类中的语法感到困惑。如果您从其他地方粘贴源代码,这种情况经常发生。

                  尝试将“未解析”的源文件减少到最低限度,进行清理和构建。成功构建后,将所有复杂性添加回您的类。

                  这让我在重新启动 Xcode 不起作用时消失了。

                  【讨论】:

                    【解决方案15】:

                    因为你还没有声明它。如果你想使用另一个类的变量,你必须使用

                    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
                        var DestViewController : ViewController = segue.destinationViewController as ViewController
                        DestViewController.signedIn = false
                    }
                    

                    您必须将此代码放在 NewClass 代码的末尾

                    【讨论】:

                    • 是的,但是我用过其他课程,没有那个他们工作得很好,就在我做这个新课程的时候。
                    • 这不行,他在全局范围内声明了signedIn变量,而不是在他的班级内。
                    猜你喜欢
                    • 2016-04-29
                    • 1970-01-01
                    • 2016-11-28
                    • 2015-05-25
                    • 2017-01-28
                    • 2015-11-27
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多