'Використання невирішеного ідентифікатора' в 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,

Будь ласка, покажіть свій код, як робочий, так і непрацюючий.
Вез,

Чи можете ви вказати версію XCode / Swift, яку ви використовуєте (бета-версія чи ні)?
lchamp

@Ichamp Xcode 6.1 не бета-версія.
Apple Geek,

1
Це ваш повний код? через ваш відступ здається, що вам не вистачає фігурної дужки }в кінці вашогоviewDidLoad()
Вец

Відповіді:


296

Однією з можливих проблем є те, що ваш новий клас має іншу ціль або інші цілі від іншої.

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

Цілі


Якщо клас знаходиться в іншій цілі, переконайтеся, що ви імпортуєте його поверх вашого швидкого файлу
Medhi,

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

О, чоловіче, я витратив пару годин, щоб вирішити цю. Таке дурне повідомлення про помилку. Навіть синтаксична помилка краще!
тюртестест

так .. це не було встановлено в цілі для тестового проекту !! дякую
reidisaki

1
Мій був у, але я просто зняв позначку, а потім знову перевірив, що виправило це І моє автозаповнення / intellisense повернулося!
Стівен Дж.

10

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


Це також працює для зміни місця розташування файлу
Логан Джордж,

точно, я видалив посилання на файли, а потім додав їх знову. і все спрацювало
Хамед Нова

7

"Використання невирішеного ідентифікатора" в Swift також трапляється, коли ви забули імпортувати бібліотеку. Наприклад, у мене є помилка: введіть тут опис зображення

У якому я забув UIKit

імпортувати UIKit


1
імпорт AVFoundation
Jenita _Alice4Real

4

Іноді компілятор плутається щодо синтаксису у вашому класі. Це трапляється багато, якщо ви вставляєте джерело з іншого місця.

Спробуйте зменшити "невирішений" вихідний файл до мінімуму, чистячи та будуючи. Після успішного побудови додайте всю складність до вашого класу.

Це змусило мене зникнути, коли перезапуск Xcode не спрацював.


4

Ще одне місце, де я бачив цю помилку, - це коли ваш проект має декілька цілей І декілька заголовків мостів . Якщо це спільний клас, переконайтеся, що ви додали ресурс до всіх мостових заголовків.

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


3

Для мене ця помилка сталася, тому що я намагався викликати вкладену функцію. Єдине , що я повинен був зробити , щоб він виправив , щоб вивести функцію з в сферу , де вона була видна.


Під "виведення функції в область, де вона була видимою", ви маєте на увазі позначити її як загальнодоступну?
Barry Jones,

Ні. Просто чисто переміщення / перетягування функції в інший обсяг, тобто під сферу дії класу
Мед

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
Це не буде працювати, він має змінну signIn, оголошену в глобальній області, а не всередині свого класу.
Сем

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.
shim

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.