'Использование неразрешенного идентификатора' в Swift


93

Итак, я делаю приложение, и все работает отлично. Но сегодня я сделал новый класс, как обычно, и по какой-то причине в этом классе я не могу получить доступ к публичной / глобальной переменной из других классов. Все остальные классы могут, но теперь, когда я пытаюсь создать новый класс, я не могу. Как бы это исправить?

Я использую 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

Пожалуйста, покажите свой код, как рабочий, так и не рабочий.
Wez

Можете ли вы указать версию XCode / Swift, которую вы используете (бета-версия или нет)?
lchamp

@Ichamp Xcode 6.1 не бета.
Apple Geek,

1
Это ваш полный код? из-за вашего отступа похоже, что вам не хватает фигурной скобки }в конце вашегоviewDidLoad()
Wez

Ответы:


296

Одна из возможных проблем заключается в том, что ваш новый класс имеет другую цель или цели, отличные от другого.

Например, у него может быть цель тестирования, а у другого - нет. В этом конкретном случае вы должны включить все свои классы в цель тестирования или ни один из них.

Цели


Если класс находится в другой цели, убедитесь, что вы импортировали его поверх своего быстрого файла
Medhi

2
хе-хе, это была проблема. Я забыл установить цель для класса. Tnx :)
tBug

Ой, я потратил пару часов, чтобы решить эту проблему. Такое глупое сообщение об ошибке. Даже синтаксическая ошибка лучше!
проверено turing

ага .. это не было задано для тестового проекта !! спасибо
reidisaki

1
Моя была, но я просто снял отметку, а затем перепроверил ее, что исправило это, И мои автозаполнение / intellisense вернулись!
Стивен Дж,

11

Однажды у меня возникла такая проблема после переименования файла. Я переименовал файл из Xcode, но впоследствии Xcode не смог найти функцию в файле. Даже чистая перестройка не устранила проблему, но закрытие и повторное открытие проекта заставили сборку работать.


Это также работает для изменения местоположения файла
Логан Джордж,

Совершенно верно, я удалил ссылки на файлы, а затем добавил их снова. и все
заработало

7

«Использование неразрешенного идентификатора» в Swift также происходит, когда вы забыли импортировать библиотеку. Например, у меня ошибка: введите описание изображения здесь

В котором я забыл UIKit

импорт UIKit


1
import AVFoundation
Jenita _Alice4Real

4

Иногда компилятор не понимает синтаксиса вашего класса. Это часто случается, если вы вставляете исходный код откуда-то еще.

Попробуйте сократить «неразрешенный» исходный файл до минимума, очистив и построив. Как только он будет успешно построен, добавьте всю сложность обратно в свой класс.

Это заставило меня уйти, когда перезапуск Xcode не работал.


4

Еще одно место, где я видел эту ошибку, - это когда ваш проект имеет несколько целей И несколько заголовков моста. . Если это общий класс, убедитесь, что вы добавили ресурс ко всем заголовкам моста.

Хороший совет - загляните в левую панель Issue Navigator; корневой объект покажет цель, которая подает жалобу.


3

Для меня эта ошибка произошла из-за того, что я пытался вызвать вложенную функцию. Единственное , что я должен был сделать , чтобы он исправил , чтобы вывести функцию из в сферу , где она была видна.


Говоря «вывести функцию из области видимости», вы имеете в виду пометить ее как общедоступную?
Барри Джонс

Нет. Просто переместите / перетащите функцию в другую область видимости, то есть в область действия класса
Дорогая,

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


да, но я использовал другие классы, и они отлично работали без этого, просто когда я делаю этот новый класс.
Apple Geek,

2
Это не сработает, у него переменная signedIn объявлена ​​в глобальной области видимости, а не внутри его класса.
Сэм

1

Ваше NewClassнаследство от UIViewController. Вы заявили signedInв ViewController. Если вы хотите NewClassиметь возможность идентифицировать эту переменную, ее нужно будет объявить в классе, от которого вы NewClassнаследуете.


1

Я получил эту ошибку для Mantle Framework в моем проекте Objective-Swift. Я пробовал,

  1. Проверьте, есть ли импорт в файле Bridging-Header.h
  2. Измените целевое членство для Framework в файле Mantle.h, как показано на снимке экрана ниже.

Переключитесь между частным членством, сначала создайте проект, в конечном итоге получите ошибки. Затем соберите проект с публичным членством для всех фреймворков, появившихся для файла Mantle.h , вы должны добиться успеха.

Это просто ошибка сборки с несколькими фреймворками в проекте Objective-C Swift.

введите описание изображения здесь


0

Если это касается созданного вами класса, убедитесь, что этот класс не вложен.

Fe

A.swift

class A {

   class ARelated {

   }
}

при вызове var b = ARelated()будет выдано «Использование неразрешенного идентификатора: ARelated».

Вы также можете:

1) разделите классы, если хотите, в одном файле:

A.swift

class A {

}

class ARelated {

}

2) Сохраняйте ту же структуру и используйте включающий класс, чтобы перейти к подклассу:

var b = A.ARelated


0

Я сделал глупую ошибку. Я забыл упомянуть класс как общедоступный или открытый при обновлении кода в рабочей области cocoapod.

Пожалуйста, проверьте, работает ли аксессуар в отдельном рабочем пространстве.


0

Вы забыли объявить переменную. Просто поставьте varпередsignedIn = false


Я бы предположил, что это просто опечатка в опубликованном коде (вместе с отсутствующей закрывающей скобкой на viewDidLoad.
прокладка

0

Моя проблема заключалась в том, что моя программа вызывала то же имя, что и одно из ее коконоподов. Это вызвало конфликт. Решение: Создайте программу под другим именем.


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), вы получите

использование неразрешенного идентификатора

ошибка.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.