programing

Swift에서 "신고되지 않은 유형의 사용", 유형이 내부이고 동일한 모듈에 존재하는 경우

i4 2023. 4. 26. 22:58
반응형

Swift에서 "신고되지 않은 유형의 사용", 유형이 내부이고 동일한 모듈에 존재하는 경우

모듈에 유형이 있습니다.

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의 컴파일러 오류?

저는 테스트 대상에 컴파일 소스에서 앱 빌드 대상에 포함된 일부 swift 파일이 없을 때 이 오류가 발생했습니다.'미신고 활자'는 다른 곳에서도 문제없이 많이 사용되고 있고, 오류도 모호해 보여서 매우 혼란스러웠습니다.따라서 '신고되지 않은 유형'이 포함된 파일을 테스트 대상에 추가할 수 있는 솔루션이 당연히 있었습니다.

@Craig Otis에서 이미 응답했지만 문제의 클래스가 동일한 대상에 속하지 않고, 일반적으로 테스트 대상이 누락된 경우 문제가 발생합니다.다음 확인란이 선택되어 있는지 확인합니다.


대상 회원 자격

편집

대상 구성원 자격을 확인합니다.파일을 선택한 후 파일 검사기(⌥ + ⌘ + 1) [옵션] + [명령] + 1을 엽니다.

상세한 묘사

휴, 마침내 이것을 진단했습니다.어떻게든, 불쾌하게 만드는 스위프트 파일은EditTaskPopoverController.swift두 개의 서로 다른 빌드 단계에 있었습니다.

에 있었습니다.Compile Sources제대로, 다른 모든 스위프트 파일들과 함께, 하지만, 그것은 또한, 매우 이상한 이유로,Copy Bundle Resources모든 XIB 및 이미지 리소스와 함께 단계도 수행합니다.

어떻게 도착했는지 모르겠지만 추가 빌드 단계에서 제거하면 문제가 해결되었습니다.

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

저도 똑같은 문제를 겪었습니다.프레임워크의 일부 파일에 동일한 모듈 내의 다른 클래스에서 연결할 수 없습니다.

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

스크린샷 1

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

스크린샷 2

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

@IBOutlet weak var tableView: CustomTableView!

구현 과정에서 CustomTableView로 시작하는 기능이 있었습니다.

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

수정 사항은 함수 서명이 유형(CustomTableView)과 동일한 문자로 시작하지 않도록 변경하는 것이었습니다. 예:

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

이것은 저의 경우 실제 원인에 대한 매우 오해의 소지가 있는 오류 메시지였습니다.

유사한 문제가 발생했지만 컴파일 소스 수정이 문제를 해결하지 못하는 경우 Xcode를 다시 시작하면 문제가 해결될 수 있습니다(제게 효과가 있었습니다).나의 Xcode 버전은Version 6.1 (6A1052d).

때때로 오류는 매우 어리석을 수 있습니다.

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

     import Foundation
     import UIKit

외부에서 프로젝트로 일부 파일을 가져올 때 제가 한 번 경험했듯이 이 기본적인 것들을 놓칠 가능성이 큽니다.

내 앱에는 공개 테스트로 액세스해야 하는 앱 대리인 및 기타 클래스가 있습니다.여기에 설명된 것처럼 앱을 테스트로 가져옵니다.

제가 최근에 두 개의 새로운 클래스를 만들었을 때, 그들의 테스트 대상은 주요 부분과 테스트 부분이었습니다.테스트에서 그들의 회원 자격을 박탈한 것이 문제를 해결했습니다.

제 경우, TestTarget의 컴파일 소스에 MainTarget의 파일이 있습니다.

참조:

테스트 대상에 컴파일 소스 탭의 주 대상의 파일이 포함되어 있습니다.

왜 이런 일이 일어날까요?

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

  • 또는 검사자에서 이 옵션을 수동으로 선택합니다.

    참조:

    파일 만들기 - 테스트 대상 선택

내가 어떻게 해결했나요?

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

저는 여기서 제공되는 솔루션들을 많이 시도했지만 결국 파일을 삭제하고 다시 생성했고, Xcode는 완화되었습니다 :/

실수로 매개 변수 이름을 대문자로 표시하고 개체와 동일하게 부르는 경우에도 이 문제가 발생할 수 있습니다.

class func didRecieveData(BlockItems: [BlockItems])

누군가에게 도움이 될 수도 있습니다.

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

클래스 이름과 같은 프로젝트 이름을 지정하지 않음(테스트)

서명에 개체 유형과 이름이 같은 함수가 있는 경우에도 이 문제가 발생할 수 있습니다.예:

class func Player(playerObj: Player)

컴파일러가 다른 파일을 보기 전에 먼저 파일 내에서 로컬로 보기 때문에 컴파일러가 혼동을 일으키게 됩니다.그래서 그것은 서명에 있는 "플레이어"를 보고, 그것은 이 범위의 물체가 아니라 기능이라고 생각합니다. 그래서 뭔가 잘못된 것입니다.

아마도 이것이 제가 수업 기능을 자본화해서는 안 되는 좋은 이유일 것입니다.:)

는 중에 에서 이 메시지를 , 를 코를프에크리에팩하 Xcode 8서데받았는를시지류, 레워선나것났잊타습다니로로 선언하는 을 잊어버린 .public

일부 "FirstNameClass"를 사용하여 클래스를 추가한 후 수동으로 "ColoredDotView"로 이름을 변경했을 수 있습니다."ColoredDotView" 클래스의 내용을 클립보드에 복사하고 프로젝트에서 "ColoredDotView"를 제거한 후 다시 추가합니다.

이 아이디는 저와 비슷한 문제를 해결해줍니다.

저의 경우는 제가 저지른 실수였습니다.저는 "iOS>소스>코코아 터치 클래스"가 아닌 "OS X>소스>코코아 클래스"로 새 파일을 추가했습니다.

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

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

첫 번째 줄에서 pipGlow는 (SKShapeNode의) 하위 클래스 이름이지만 두 번째 줄에서는 변수 이름으로 pipGlow를 사용했습니다.이것은 나쁜 코딩 스타일일 뿐만 아니라 명백히 완전히 금지된 것입니다!두 번째 줄을 다음으로 변경하면 다음과 같습니다.

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

저는 더 이상 오류를 받지 못했습니다.이것이 누군가에게 도움이 되기를 바랍니다!

응용프로그램에 속하는 Swift 코드를 테스트할 때는 먼저 테스트 대상이 응용프로그램을 종속성으로 빌드하고 있는지 확인합니다.그런 다음 테스트에서 응용 프로그램을 모듈로 가져옵니다.예:

@testable import MyApplication

이렇게 하면 응용 프로그램의 일부인 Swift 개체를 테스트에 사용할 수 있습니다.

저의 경우, 그것은 swift 파일의 텍스트 인코딩으로 인해 발생했습니다.한 파일에는 '명시적 인코딩 없음'이 표시되었고, 이를 'UTF-8'로 변환한 후 문제가 해결되었습니다.

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

명시적 인코딩 스크린샷 없음

여기에 이미지 설명 입력

UTF-8 스크린샷

여기에 이미지 설명 입력

프로젝트를 청소하는 것이 제 문제를 해결했습니다.

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

내 경우 사용자 지정 swift 개체를 형식 매개 변수로 사용하는 메서드를 추가하고 싶었으며 매개 변수에 지정한 이름이 사용자 지정 개체 클래스 이름과 정확히 동일합니다.

문제는 다음과 같습니다.

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

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

다른 사람들이 잘 언급했듯이 그리고 이 에서.

"번들 리소스 복사"에서 불필요한 신속한 파일 사용

다른 사람들처럼, 그것은 관련이 없는 코드가 원인이었습니다.@testable고장이 나다

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

@import ModuleUnderTest;

(수입이 실제로 불필요했기 때문에) 이 라인을 제거했고 기적적으로@testable다시 일을 시작합니다.

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

에서 접속하는 .module또는Target그러면 당신은 그것이 필요합니다.public그것

만약 누군가가 나와 같은 어리석은 실수를 저지르면,

소스 파일의 이름을 변경할 때 실수로 제거했기 때문에 이 오류가 발생했습니다..컴파일러는 파일 이름으로부터 파일을 컴파일할 소스가 아닌 일반 텍스트 파일로 처리했습니다.

그래서 나는 파일 이름을 다음으로 바꾸려고 했습니다.MyProtocol.swift하지만 우연히 이름을 지었습니다.MyProtocolswift

단순한 실수지만, 이게 무슨 일인지 쉽게 알 수 없었습니다.

올바른 가져오기 세부 정보를 추가하지 않는 것도 명백한 실수가 될 수 있습니다.저는 우선 순위 가져오기를 생략했습니다.네, 알겠습니다.

제 상황은 새로운 파일 XXView.swift를 프로젝트에 끌어다 놓는 것입니다.그리고 보기 유형을 XXView로 선언하고 "신고되지 않은 유형 사용..." 오류를 표시합니다.

오류를 해결한 테스트 대상에 XXView.swift를 추가하려고 합니다.하지만 저는 제 UI 클래스가 테스트 대상에 포함되는 것을 원하지 않았습니다.

마지막으로, 나는 내 ViewController가 이미 테스트 대상에 있다는 것을 발견했는데, 이는 발생해서는 안 됩니다. (xctemplate로 VC를 생성하기 때문에 테스트 대상에 자동으로 포함된다고 생각합니다.)

테스트 대상에서 보기 컨트롤러를 제거하면 XXView를 테스트 대상에 추가할 필요가 없습니다.

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

이 오류에 대해 한 시간을 소비한 결과 모듈 파일이 중복된 것을 발견했습니다.추가 파일을 삭제하고 shift+sship+k를 삭제하면 오류가 사라집니다.

제 경우, 문제는 새로운 것이었습니다.class인정받지 못하는클래스를 삭제하고 다시 추가하여 문제를 해결했지만 이번에는 확인합니다.Watch App Extension새 클래스를 만들 때 옵션을 선택합니다.

여기에 이미지 설명 입력

애플리케이션에 Watch App Extension이 있습니다.

언급URL : https://stackoverflow.com/questions/25437891/use-of-undeclared-type-in-swift-even-though-type-is-internal-and-exists-in-s

반응형