Swift中的“使用未解决的标识符”


93

因此,我一直在开发一个应用程序,并且一切正常。但是今天我像往常一样创建了一个新类,由于某种原因,我不能从其他类中访问Public / Global变量。所有其他班级都可以,但是现在无论何时我尝试开设一个新班级我都做不到。如何解决?

我正在使用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”


是的,我已经多次删除并重新创建了该课堂
Apple Geek

请显示您的代码,无论工作与否。
2015年

您可以指定使用的XCode / Swift版本(是否为Beta版)吗?
lchamp 2015年

@Ichamp Xcode 6.1不是beta。
Apple Geek 2015年

1
这是您完整的代码吗?由于您的缩进,您似乎}在结尾处缺少花括号viewDidLoad()
Wez 2015年

Answers:


296

一个可能的问题是您的新班级与另一个班级有不同的目标。

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

目标


如果该课程位于其他目标中,请确保将其导入到您的swift文件顶部
Medhi,2016年

2
呵呵,那是个问题。我忘了设置上课的目标。Tnx :)
tBug

哦,老兄,我花了几个小时来解决这个问题。如此愚蠢的错误消息。甚至语法错误更好!
turingtest

是的,这不是测试项目的目标!!谢谢你
reidisaki

1
我的进来了,但我只是取消选中然后重新检查,这解决了这个问题,并且我的自动完成/智能提示又回来了!
Stephen J


5

重命名文件后出现此问题。我从Xcode中重命名了文件,但是之后Xcode在文件中找不到该函数。即使是干净的重建也无法解决问题,但是先关闭然后重新打开项目,即可使构建正常进行。


这也适用于更改文件的位置
Logan George

完全正确,我删除了文件引用,然后再次添加了它们。一切正常
Hamed Nova

4

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

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

当重新启动Xcode无效时,这对我而言已消失。


4

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

一个很好的提示是在左侧的Issue Navigator面板中查看;根对象将显示发出投诉的目标。


3

对我来说,发生此错误是因为我试图调用嵌套函数。唯一的事情我不得不这样做有它固定为使功能的范围内它是可见的。


通过“将功能扩展到可见的范围”,您是说将其标记为公开吗?
巴里·琼斯

否。仅将函数移动/拖动到不同的范围内,即在类的范围内
Honey,

3

就我而言,我有一个Object-C文件,该文件也具有相同的目标成员身份。我通过添加#import "YourObjectCFileHeader.h"内部文件来修复Bridging-Header.h


1

因为您尚未声明。如果要使用其他类的变量,则必须使用

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

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


是的,但是我使用了其他类,并且没有这些类,它们也能正常工作,这是我开设新类的时间。
苹果极客

2
这是行不通的,他在全局范围内而不是在类内部声明了signIn变量。
萨姆

1

您的NewClass继承人是UIViewController。您signedIn在中声明ViewController。如果您希望NewClass能够识别该变量,则必须在您NewClass继承该变量的类中对其进行声明。


1

我在Objective-Swift项目中遇到了Mantle Framework错误。我试过的是

  1. 检查Bridging-Header.h文件中是否存在导入
  2. 更改Mantle.h文件中的Framework的目标成员资格,如下面的屏幕快照所示。

在“私人成员身份”之间进行切换会首先构建项目,最后出现错误。然后,为Mantle.h出现的所有框架使用公共成员身份构建项目。文件中,您必须成功。

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

在此处输入图片说明


0

如果这与您创建的类有关,请确保该类未嵌套。

斯威夫特

class A {

   class ARelated {

   }
}

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

您可以:

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

斯威夫特

class A {

}

class ARelated {

}

2)保持相同的结构,并使用封闭类访问子类:

var b = A.ARelated


0

我犯了一个愚蠢的错误。我忘了在更新cocoapod工作区中的代码时将类称为公共类或开放类。

请检查是否在单独的工作空间中使用accesor。



0

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


0

这不是直接针对您的代码示例,而是关于错误的一般信息。我在这里写它,因为Google将此错误引向了这个问题,因此对其他开发人员可能有用。


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

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),您将得到

使用未解决的标识符

错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.