'Использование неразрешенного идентификатора' в 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
источник
и да, я несколько раз удалял и воссоздавал этот класс
Apple Geek
Пожалуйста, покажите свой код, как рабочий, так и не рабочий.
Wez
Можете ли вы указать версию XCode / Swift, которую вы используете (бета-версия или нет)?
lchamp
@Ichamp Xcode 6.1 не бета.
Apple Geek,
1
Это ваш полный код? из-за вашего отступа похоже, что вам не хватает фигурной скобки }в конце вашегоviewDidLoad()
Wez

Ответы:

296

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

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

Цели

lchamp
источник
Если класс находится в другой цели, убедитесь, что вы импортировали его поверх своего быстрого файла
Medhi
2
хе-хе, это была проблема. Я забыл установить цель для класса. Tnx :)
tBug
Ой, я потратил пару часов, чтобы решить эту проблему. Такое глупое сообщение об ошибке. Даже синтаксическая ошибка лучше!
проверено turing
ага .. это не было задано для тестового проекта !! спасибо
reidisaki
1
Моя была, но я просто снял отметку, а затем перепроверил ее, что исправило это, И мои автозаполнение / intellisense вернулись!
Стивен Дж,
11

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

ThomasW
источник
Это также работает для изменения местоположения файла
Логан Джордж,
Совершенно верно, я удалил ссылки на файлы, а затем добавил их снова. и все
заработало
7

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

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

импорт UIKit

Минусы Булакены
источник
1
import AVFoundation
Jenita _Alice4Real
4

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

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

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

змеиное масло
источник
4

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

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

Capikaw
источник
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

Fil0tti
источник
да, но я использовал другие классы, и они отлично работали без этого, просто когда я делаю этот новый класс.
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), вы получите

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

ошибка.

Vive
источник