유형이 내부적이며 동일한 모듈에 존재하더라도 Swift에서 "선언되지 않은 유형 사용"


173

내 모듈에 유형이 있습니다.

import Cocoa

class ColoredDotView : NSView {
   ...
}

문제없이 여러 가지 다른 클래스에서 사용됩니다.

class EditSubjectPopoverController : NSObject {

    @IBOutlet internal var subjectColorDotView : ColoredDotView!
    ...
}

그러나 어떤 이유로 하나의 특정 클래스 에서 사용 하면 유형에 대한 컴파일 오류가 있습니다.

class EditTaskPopoverController : NSObject {

    @IBOutlet internal var lowPriorityDotView : ColoredDotView! // Error here
    @IBOutlet internal var medPriorityDotView : ColoredDotView! // And here...
    @IBOutlet internal var highPriorityDotView : ColoredDotView! // And here...
    ...
}

컴파일 오류는 다음과 같습니다.

EditTaskPopoverController.swift : 15 : 49 : 선언되지 않은 'ColoredDotView'유형 사용

이해가 안 돼요 파일의 첫 번째 컴파일 오류이며 나머지 오류는 모두 첫 번째의 증상입니다. 또한 컴파일 오류가있는 다른 파일없습니다 . 파일이 동일한 모듈에 있기 때문에 유형이 선언되지 않은 이유를 이해할 수 없습니다.

여기에 이미지 설명을 입력하십시오

프로젝트 정리, 빌드 폴더 정리 및 Xcode 재시작을 시도했지만 아무 소용이 없습니다. undeclared typeSwift에서 컴파일러 오류를 일으킬 수있는 잠재적 인 실수는 무엇입니까 ?


실제 오류가 몇 줄 이상인 경우가 많았으며 Xcode는 오류 메시지로 무해한 것을 잘못 태그했습니다. 코드의 나머지 부분을 지워서 오류가 사라지는 지 살펴보고 비트 단위로 다시 추가하십시오.
Nate Cook

고마워 네이트-불행히도 var선언을 제거하고 지나가는 빌드로 넘어갑니다. 그런 다음 맨 위에 선언 중 하나 를 추가 하면 오류가 즉시 다시 나타납니다. imgur.com/VUUBK2K
Craig Otis

답변:


200

내 테스트 대상에 내 앱 빌드 대상에 컴파일 소스에있는 빠른 파일이 없을 때이 오류가 발생했습니다. '선언되지 않은 유형'이 다른 많은 장소에서 문제없이 사용되어 매우 혼란 스러웠으며 오류가 모호해 보였습니다. 따라서 해결책은 '선언되지 않은 유형'을 포함하는 파일을 테스트 대상에 추가하는 것입니다.


2
나에게도 마찬가지입니다 : 테스트 대상에 포함 된 다른 클래스가 사용하는 클래스가 테스트 대상에도 포함되지 않은 경우 문제가 발생합니다! (╯ ° □ °) ╯︵ ┻━┻
Francesco Vadicamo

2
당신은 30 분 동안 나를 괴롭힌 문제를 해결했습니다. 이전 Swift 클래스를 현재 프로젝트로 가져 왔지만 아직 테스트 클래스에 이전 클래스를 추가하지 않았습니다. 그러나 자동 완성 기능은 모든 것이 훌륭하다고 생각하게 만들었습니다. 뭐야 ...! 정말 고마워.
Jim Hillhouse

2
이것은 나에게도 문제를 해결했다. 파일을 클릭하고 파일-> 사본을 복사했습니다. 새로운 사본이 나열되었지만 "컴파일 소스"에 포함되지 않음
Ron Myschuk

1
필자의 경우 3 개의 대상 (프로젝트, UI 및 단위 테스트)을 선택
했으며이

1
"물론 해결책 ..."은 독자가 테스트 대상을 추가하는 방법을 이해한다고 가정합니다. Xcode로 시작하는 것은 "물론 ..."순간이 아닙니다. 그가 당신의 대답을 마쳤을 때 @edwin의 대답을 찬성했습니다.
Michael

181

이것은 @Craig Otis에 의해 이미 답변되었지만 문제의 클래스가 동일한 대상에 속하지 않을 때 문제가 발생합니다. 일반적으로 테스트 대상이 없습니다. 다음 확인란이 선택되어 있는지 확인하십시오.


대상 회원

편집하다

대상 멤버쉽을 보려면 파일을 선택한 다음 파일 관리자를 엽니 다 (⌥ + ⌘ + 1) [ 옵션 ] + [ 명령 ] + 1

상세 설명


확실하지 않지만 "TEST"대상을 선택 취소하면 (이 경우 YAWA-WeatherTest입니다). 오류없이 구축되었습니다.
dellos

XCode에서이 대상 멤버십을 설정할 위치를 명확히 하시겠습니까? 전에 본 기억이 없습니다. 감사.
케이시 퍼킨스

2
실제로 테스트 프로젝트에서 "@testable import ..."인 테스트 목표를 선택 취소하십시오.
drew ..

스크린 샷은 매우 유용합니다. 감사!
Michael

37

휴, 마침내 이것을 진단했습니다. 어떻게 든 문제가되는 Swift 파일 EditTaskPopoverController.swift은 두 가지 빌드 단계에있었습니다.

에 있었다 Compile Sources 다른 모든 스위프트 파일을 제대로 만했다 또한 에, 매우 이상한 이유로, Copy Bundle Resources내 모든 XIB 및 이미지 자료와 함께,뿐만 아니라 상.

나는 그것이 어떻게 도착했는지 알지 못하지만 여분의 빌드 단계에서 제거하면 문제가 해결되었습니다.


나는 내가 사용하고 있기 때문에, 밝혀졌다 같은 문제가 있었다 github.com/kronenthaler/mod-pbxproj 실수로 모드-pbxproj 대신 PBXSourcesBuildPhase의 PBXResourcesBuildPhase과 유형에 신속을 추가했고, 스위프트
RICHY

2
항해사! 생명의 은인이 내 머리를 부 reck 버렸다. 건배
SparkyRobinson

27

XCode 메뉴에서 Product-> Clean 다음 Product-> Build가 나를 위해 일했습니다. 새 그룹 / 폴더의 프로젝트에 새 ViewController를 추가 할 때이 문제가 발생했습니다.


5
2 시간, 포드를 설치 한 후 프레임 워크를 통합하기 위해 빌드 버튼을 클릭 한 적이 없었습니다 ... 지금 나가겠습니다 ...
Cruceo

1
다른 답변을 시도하여 많은 시간을 허비했지만 결코 청소하고 짓지 않았습니다. 감사합니다
Zeero0

Apple 자습서를 따르는 동안 Xcode 11.0 베타 5에서 SwiftUI를 사용하는 동안이 오류가 발생했습니다. 캔버스에 다른 파일이 올바르게 표시되었지만 새로 추가 된 파일에서 LandmarkRow_Previews가 선언되지 않은 유형이라는이 오류가 발생했습니다. Clean 만 빌드하면 문제가 해결되었습니다.
salo.dm 1

이 답변은 기술 지원에 해당합니다. "장치를 다시 시작하셨습니까?" 좋은 팁 :)
turingtested

14

나는 똑같은 문제가 있었다. 내 프레임 워크의 일부 파일은 동일한 모듈 내 다른 클래스에서 도달 할 수 없었습니다.

어떤 이유로 Xcode의 프레임 워크에 추가 된 파일은 컴파일 소스의 일부가 아닙니다. Swift 파일이 컴파일 소스의 일부가 아닌 경우 +를 누르고 팝업에서 파일을 선택하여 추가해야합니다.

스크린 샷 1

또한 파일이 프레임 워크 대상의 일부인지 확인하십시오. (아래 스크린 샷의 작은 상자를 선택해야합니다)

스크린 샷 2


12

나를위한 원인은 유형과 동일한 문자로 시작하는 함수 이름이었습니다.

@IBOutlet weak var tableView: CustomTableView!

구현에서 CustomTableView로 시작하는 함수가 있습니다.

func CustomTableView(tableView: CustomTableView, dataForRow row:  Int) -> NSData {...}

수정은 함수 서명이 유형 (CustomTableView)과 같은 문자로 시작하지 않도록 변경되었습니다. 예를 들면 다음과 같습니다.

func dataForRow(row: Int, tableView: CustomTableView) -> NSData {...}

이것은 내 경우의 실제 원인에 대해 매우 잘못된 오류 메시지였습니다.


1
이 수정 프로그램 Andrew를 게시 해 주셔서 감사합니다. 큰 도움이되었습니다. 오류 메시지는 확실히 오해의 소지가 있습니다.
jjc99

7

누군가 비슷한 문제가 발생하지만 컴파일 소스 수정으로 문제해결 되지 않으면 Xcode를 다시 시작하면 나에게 도움이 될 수 있습니다. 내 Xcode 버전은입니다 Version 6.1 (6A1052d).


코드를 추가로 변경하지 않고 빌드가 성공적으로 완료된 후에도 오류가 다시 발생했지만 다시 시작하면 효과가있었습니다.
드문

Xcode를 다시 시작하면 많은 문제가 해결되므로 Apple은 실제로 그것에 대해 무언가를해야합니다.
Forge

5

내 앱에는 테스트로 공개적으로 액세스 해야하는 앱 델리게이트 및 기타 클래스가 있습니다. 여기요약 된대로 내 앱을 테스트로 가져옵니다.

최근에 두 개의 새로운 클래스를 만들었을 때 테스트 대상은 주요 및 테스트 부분이었습니다. 테스트에서 멤버십에서 제거하면 문제가 해결되었습니다.


5

필자의 경우 TestTarget의 컴파일 소스에는 Main Target의 파일이 있습니다 .

참조 :

테스트 대상에는 컴파일 소스 탭에 기본 대상의 파일이 포함됩니다.

왜 이런 일이 발생합니까?

  • 파일을 만드는 동안 TestTarget 연결을 확인하기 때문에 발생합니다

  • 또는 관리자에서이 옵션을 수동으로 확인하십시오.

    참조 :

    파일 작성-테스트 대상 확인

어떻게 해결 했습니까?

  • 테스트 대상의 컴파일 소스에서 기본 대상의 파일을 제거했습니다.

5

때때로 오류는 매우 바보 일 수 있습니다

여기에있는 모든 솔루션을 확인하기 전에 모든 기본 항목을 가져 왔는지 확인하십시오.

     import Foundation
     import UIKit

외부에서 프로젝트로 일부 파일을 가져올 때 한 번 경험했던 것과 같은 기본 사항을 놓칠 수 있습니다.


CLLocationManagerDelegate에서 나에게 일어 났으며 20 분을 낭비 한 이유와 같이이 다른 파일에서 CoreLocation을 가져 오기 만하면됩니다.
데릭

4

여기에 제공된 많은 솔루션을 시도했지만 결국 파일을 삭제하고 다시 만들었고 Xcode는 화를 냈습니다.


이것은 나를 위해 일했다. 참조를 제거하고 정리하고 빌드 한 다음 파일을 다시 추가했습니다.
andnil

감사합니다! 이것은 매우 기이합니다. 나도 일 했어 오래된 코드를 삭제하고 오래된 코드를 새 파일로 복사하면 정리 / 빌드 할 필요조차 없었습니다.
timman

4

실수로 매개 변수 이름을 대문자로 바꾸고 개체와 동일하게 호출하는 경우에도 발생할 수 있습니다.

class func didRecieveData(BlockItems: [BlockItems])

3

이것은 누군가를 도울 수 있습니다.

"CoreData"라는 Core Data로 새로운 테스트 프로젝트를 만들었습니다. 곧 NSManagedObjectContext 및 기타 핵심 데이터 클래스에 대해 "선언되지 않은 유형 사용"이 있습니다. 가져 오기, 빌드 단계 등에 추가 등을 여러 번 시도한 후 프로젝트를 삭제하고 "TestingCoreData"라는 새 프로젝트를 시작했는데 모두 제대로 작동했습니다.

학급 이름과 같은 프로젝트의 이름을 지정하지 마십시오 (테스트)


3

서명에 객체 유형과 이름이 같은 함수가있는 경우에도 발생할 수 있습니다. 예를 들면 다음과 같습니다.

class func Player(playerObj: Player)

컴파일러는 다른 파일을보기 전에 먼저 파일 내에서 로컬로 검색하기 때문에 컴파일러가 혼동 될 수 있습니다. 따라서 서명에서 "플레이어"를보고이 범위의 개체가 아니라 함수이므로 무언가 잘못되었다고 생각합니다.

아마도 이것이 클래스 함수를 대문자로 사용해서는 안되는 좋은 이유 일 것입니다. :)


3

프레임 워크에 코드를 리팩토링하는 동안 Xcode 8 에서이 오류 메시지가 나타납니다. 프레임 워크에서 클래스를 선언하는 것을 잊어 버렸습니다. public


2

"FirstNameClass"라는 클래스를 추가 한 후 수동으로 "ColoredDotView"로 이름을 바꿉니다. "ColoredDotView"클래스의 컨텐츠를 클립 보드에 복사하고 프로젝트에서 "ColoredDotView"를 제거하고 agin을 추가하십시오.

이 ID는 나에게서 비슷한 문제를 해결합니다.



2

필자의 경우 이것은 하위 클래스 이름이 다음 줄에서 다른 유형의 변수 이름으로 사용되기 때문에 발생했습니다.

var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlow: PipGlowSprite = PipGlowSprite()

1 행에서 pipGlow는 SKShapeNode의 서브 클래스 이름이지만 2 행에서는 pipGlow를 변수 이름으로 사용하고 있습니다. 이것은 나쁜 코딩 스타일 일뿐 만 아니라 명백히 그렇습니다. 두 번째 줄을 다음과 같이 변경하면 :

var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlowSprite: PipGlowSprite = PipGlowSprite()

더 이상 오류가 발생하지 않았습니다. 나는 이것이 누군가를 돕기를 바랍니다!


2

애플리케이션에 속하는 Swift 코드를 테스트 할 때 먼저 테스트 대상이 애플리케이션을 종속성으로 빌드하고 있는지 확인하십시오. 그런 다음 테스트에서 응용 프로그램을 모듈로 가져옵니다. 예를 들면 다음과 같습니다.

@testable import MyApplication

이를 통해 응용 프로그램의 일부인 Swift 객체를 테스트 할 수 있습니다.


2

필자의 경우 빠른 파일의 텍스트 인코딩으로 인해 발생했습니다. 하나의 파일에 '명시적인 인코딩 없음'이 표시되었고이를 'UTF-8'로 변환 한 후 문제가 해결되었습니다.

그리고 파일의 텍스트 인코딩이 명시 적이 지 않은 이유는 다른 빠른 파일에서 모든 코드를 복사했기 때문입니다.

명시 적 인코딩 없음

여기에 이미지 설명을 입력하십시오

UTF-8 스크린 샷

여기에 이미지 설명을 입력하십시오


2

프로젝트를 청소하면 내 문제가 해결되었습니다.

단계 : 제품-> 청소 (또는 Shift + Cmd + K)


1

필자의 경우 사용자 정의 신속한 객체를 유형 매개 변수로 사용하여 메소드를 추가하고 싶었고 매개 변수의 변수에 지정한 이름은 사용자 정의 객체 클래스 이름과 정확히 동일했습니다.

문제는 다음과 같습니다.

func moveBlob(**blob** : blob){
    ...code
}

굵은 글씨로 표시된 부분 이 선언되지 않은 유형의 오류를 일으켰습니다.



1

다른 사람들과 마찬가지로 관련이없는 코드로 인해 @testable 오작동 .

내 테스트 대상에는 다음과 같은 Objective-C 헤더 파일이 있습니다.

@import ModuleUnderTest;

가져 오기가 실제로 불필요했기 때문에이 줄을 제거하고 기적적으로 @testable다시 작업을 시작했습니다.

나는 이것을 추적 할 수 있었지만 프로젝트에서 모든 것을 제거하고 실패 할 때까지 조금씩 다시 추가 할 수있었습니다. 결국 나는 문제의 코드 줄을 발견했다.



1

누군가 내가했던 바보 같은 실수를 저지른 경우

소스 파일의 이름을 바꿀 때 실수로 파일을 제거했기 때문에이 오류가 발생했습니다.. 하여 컴파일러가 파일을 일반 텍스트 파일로 취급하고 컴파일 할 소스가 아닌 것으로 취급 .

파일 이름을 바꾸려고 MyProtocol.swift 했지만 실수로 이름을 지정했습니다. MyProtocolswift

그것은 단순한 실수이지만, 이것이 일어나고 있음을 쉽게 알 수 없었습니다.


1

올바른 가져 오기 구분을 추가하지 않는 것도 분명한 실수 일 수 있습니다. 나를 위해 PriorityUIKit 가져 오기를 생략했습니다.


1

내 상황은 새 파일 XXView.swift를 프로젝트로 드래그하는 것입니다. 그리고보기 유형을 XXView로 선언 한 다음 "선언되지 않은 유형 사용 ...."오류가 발생합니다.

XXView.swift를 테스트 대상에 추가하여 오류를 해결하려고했습니다. 그러나 UI 클래스를 테스트 대상에 포함시키고 싶지 않았습니다.

마지막으로 ViewController가 테스트 대상에 이미 있음을 발견했습니다. (나는 xctemplate에 의해 VC를 생성하기 때문에 테스트 대상에 자동으로 포함된다고 생각한다)

테스트 대상에서 뷰 컨트롤러를 제거한 다음 XXView를 테스트 대상에 추가 할 필요가 없습니다.

결론 : 모든 관련 파일도 테스트 대상을 선택 취소해야합니다.


1

이 오류에 대해 한 시간을 보낸 후 모듈 파일이 중복 된 것을 발견했습니다. 여분의 파일을 삭제하고 shift + cmd + k를 사용하여 정리하면 오류가 사라집니다.


이것은 어리석은 질문 일 수 있지만 그것에 대해 더 자세히 설명 할 수 있습니까? 중복 빠른 파일 또는 중복 그룹 등에서도 이런 일이 발생합니까? 그것은 효과가 있었지만 그것이 작동한다는 것을 받아들이는 것보다 왜 작동하는지에 대해 더 알고 싶습니다. 그런데 솔루션 주셔서 감사합니다!
Cody Vollrath

1

제 경우에는 문제가 새로운 class것으로 인식되지 않았습니다. 클래스를 삭제하고 다시 추가하여 문제를 해결했지만 이번에 Watch App Extension는 새 클래스를 만들 때 옵션을 확인합니다 .

여기에 이미지 설명을 입력하십시오

내 응용 프로그램에 Watch App Extension이 있습니다.


고마워 내 경우에는 파일을 올바른 파일에 추가해야했습니다 Target.
coletrain
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.