'การใช้ตัวระบุที่ไม่ได้รับการแก้ไข' ใน 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

โปรดแสดงรหัสของคุณทั้งที่ใช้งานได้และไม่ทำงาน
Wez

คุณสามารถระบุเวอร์ชันของ XCode / Swift ที่คุณใช้ (ถ้าเป็นเบต้าหรือไม่)
lchamp

@Ichamp Xcode 6.1 ไม่ใช่เบต้า
Apple Geek

1
นี่คือรหัสที่สมบูรณ์ของคุณหรือไม่ เนื่องจากการเยื้องของคุณดูเหมือนว่าคุณไม่มีวงเล็บปีกกา}ที่ส่วนท้ายของคุณviewDidLoad()
Wez

คำตอบ:


296

ปัญหาหนึ่งที่เป็นไปได้คือคลาสใหม่ของคุณมี Target หรือ Target ที่แตกต่างจากคลาสอื่น

ตัวอย่างเช่นอาจมีเป้าหมายการทดสอบในขณะที่อีกเป้าหมายหนึ่งไม่มี สำหรับกรณีนี้คุณต้องรวมคลาสทั้งหมดของคุณไว้ในเป้าหมายการทดสอบหรือไม่มีเลย

เป้าหมาย


หากชั้นเรียนอยู่ในเป้าหมายอื่นอย่าลืมนำเข้าที่ด้านบนของไฟล์ที่รวดเร็วของคุณ
Medhi

2
ฮิฮินั่นเป็นปัญหา ฉันลืมตั้งเป้าหมายสำหรับชั้นเรียน Tnx :)
tBug

โอ้ฉันใช้เวลาสองสามชั่วโมงในการแก้ปัญหานี้ ข้อความแสดงข้อผิดพลาดโง่ ๆ แม้แต่ Syntax Error ก็ดีกว่า!
turingtested

เออ .. มันไม่ได้ตั้งเป้าไว้สำหรับโครงการทดสอบ !! ขอบคุณ
reidisaki

1
ของฉันเข้ามาแล้ว แต่ฉันเพิ่งยกเลิกการเลือกแล้วตรวจสอบอีกครั้งซึ่งแก้ไขสิ่งนี้และการเติมข้อความอัตโนมัติ / Intellisense ของฉันก็กลับมา!
Stephen J

11

เมื่อฉันมีปัญหานี้หลังจากเปลี่ยนชื่อไฟล์ ฉันเปลี่ยนชื่อไฟล์จากภายใน Xcode แต่หลังจากนั้น Xcode ไม่พบฟังก์ชันในไฟล์ แม้แต่การสร้างใหม่ทั้งหมดก็ไม่สามารถแก้ไขปัญหาได้ แต่การปิดและเปิดโปรเจ็กต์อีกครั้งทำให้งานสร้างใช้งานได้


นอกจากนี้ยังใช้ได้กับการเปลี่ยนตำแหน่งของไฟล์
Logan George

ถูกต้องฉันลบการอ้างอิงไฟล์แล้วเพิ่มอีกครั้ง และทุกอย่างทำงาน
Hamed Nova

7

'การใช้ Unresolved Identifier' ใน Swift my ยังเกิดขึ้นเมื่อคุณลืมนำเข้าไลบรารี ตัวอย่างเช่นฉันมีข้อผิดพลาด: ป้อนคำอธิบายภาพที่นี่

ซึ่งฉันลืม UIKit

นำเข้า UIKit


1
import AVFoundation
Jenita _Alice4Real

4

บางครั้งคอมไพเลอร์สับสนเกี่ยวกับไวยากรณ์ในชั้นเรียนของคุณ สิ่งนี้จะเกิดขึ้นได้มากหากคุณวางแหล่งที่มาจากที่อื่น

ลองลดซอร์สไฟล์ที่ "ยังไม่ได้รับการแก้ไข" ให้เหลือน้อยที่สุดทั้งการทำความสะอาดและการสร้าง เมื่อสร้างสำเร็จแล้วให้เพิ่มความซับซ้อนทั้งหมดกลับไปที่ชั้นเรียนของคุณ

สิ่งนี้ทำให้ฉันหายไปเมื่อเริ่ม Xcode ใหม่ไม่ได้ผล


4

สถานที่อื่นที่ผมเคยเห็นข้อผิดพลาดนี้เมื่อโครงการของคุณมีเป้าหมายหลายและส่วนหัวของการเชื่อมโยงหลาย หากเป็นคลาสที่ใช้ร่วมกันตรวจสอบให้แน่ใจว่าคุณได้เพิ่มทรัพยากรในส่วนหัวเชื่อมโยงทั้งหมด

เคล็ดลับที่ดีคือการดูในพาเนล Issue Navigator ด้านซ้าย ออบเจ็กต์รากจะแสดงเป้าหมายที่กำลังยื่นเรื่องร้องเรียน


3

สำหรับฉันข้อผิดพลาดนี้เกิดขึ้นเนื่องจากฉันพยายามเรียกใช้ฟังก์ชันที่ซ้อนกัน สิ่งเดียวที่ฉันต้องทำเพื่อแก้ไขก็คือการนำฟังก์ชันออกไปในขอบเขตที่มองเห็นได้


โดย "นำฟังก์ชันออกไปในขอบเขตที่มองเห็นได้" คุณหมายถึงทำเครื่องหมายเป็นสาธารณะหรือไม่
Barry Jones

ที่เพียงแค่การเคลื่อนย้ายอย่างหมดจด / ลากฟังก์ชั่นให้เป็นเช่นขอบเขตที่แตกต่างกันภายใต้ขอบเขตของการเรียน
น้ำผึ้ง

3

ในกรณีของฉันฉันมีไฟล์ Object-C ซึ่งอยู่ใน Target Membership เดียวกันด้วย ฉันแก้ไขโดยการเพิ่ม#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. เปลี่ยน Target Membership for Framework ในไฟล์Mantle.hดังที่แสดงในภาพหน้าจอด้านล่าง

สลับระหว่างการเป็นสมาชิกส่วนตัวก่อนสร้างโปรเจ็กต์จบลงด้วยข้อผิดพลาด จากนั้นสร้างโครงการด้วย Public Membership สำหรับเฟรมเวิร์กทั้งหมดที่ปรากฏสำหรับไฟล์Mantle.hคุณต้องประสบความสำเร็จ

มันเป็นเพียงข้อผิดพลาดของการสร้างด้วยเฟรมเวิร์กที่หลากหลายในโปรเจ็กต์ Objective-C Swift

ป้อนคำอธิบายภาพที่นี่


0

หากสิ่งนี้เกี่ยวข้องกับคลาสที่คุณสร้างขึ้นโปรดตรวจสอบว่าคลาสนั้นไม่ได้ซ้อนกัน

เฟ

ก. Swift

class A {

   class ARelated {

   }
}

การโทรvar b = ARelated()จะให้ 'Use of unresolved identifier: ARelated'

คุณสามารถ:

1) แยกคลาสหากต้องการในไฟล์เดียวกัน:

ก. Swift

class A {

}

class ARelated {

}

2) รักษาโครงสร้างเดิมของคุณและใช้คลาสปิดล้อมเพื่อไปยังคลาสย่อย:

var b = A.ARelated


0

ฉันทำพลาดโง่ ๆ ฉันลืมที่จะพูดถึงคลาสเป็นสาธารณะหรือเปิดอยู่ในขณะอัปเดตโค้ดในพื้นที่ทำงาน cocoapod

โปรดตรวจสอบว่า accesor ทำงานในพื้นที่ทำงานแยกกันหรือไม่


0

คุณลืมประกาศตัวแปร เพียงแค่วางไว้varด้านหน้าของsignedIn = false


ฉันจะคิดว่านั่นเป็นเพียงพิมพ์ผิดในรหัสโพสต์ (พร้อมด้วยวงเล็บหายไปปิดบนviewDidLoad.
ชิม

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)จะได้รับ

การใช้ตัวระบุที่ไม่ได้รับการแก้ไข

ข้อผิดพลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.