다른 Swift 파일에서 Swift 파일을 가져 오려면 어떻게합니까?


154

테스트와 같은 다른 파일의 Swift 클래스를 포함시키고 싶습니다.

PrimeNumberModel.swift

import Foundation

class PrimeNumberModel { }

PrimeNumberModelTests.swift

import XCTest
import PrimeNumberModel  // gives me "No such module 'PrimeNumberModel'"

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()  // "Use of unresolved identifier 'PrimeNumberModel'"    
}

두 빠른 파일은 모두 같은 디렉토리에 있습니다.



2
Apple 문서에 따르면 두 파일 모두 동일한 대상을 가질 때 가져 오기가 필요하지 않습니다. 슬프게도 테스트에는 다른 목표가 있습니다. 가능한 해결책 중 하나는 yourModule / PrimeNumberModel을 사용하여 가져 오기 명령문을 수행하는 것입니다.
Alex Reynolds가

@ joseph.hainline 나는 같은 문제에 직면하고 있습니다. 어떻게 해결 될까요? 나는 지금 붙어 있습니다.
개발자

답변:


131

XCTestCase파일 에서도 같은 문제가 있었지만 일반 프로젝트 파일에는 없었습니다.

를 제거하려면 :

확인되지 않은 식별자 'PrimeNumberModel'사용

import테스트 파일의 기본 모듈이 필요했습니다 . 내 경우에는 내 목표 를 'myproject'라고 import myproject하고 클래스를 추가했습니다 .


2
더 많은 투표가 필요합니다. 단지 시험 대상에 .swift 파일을 추가하라는 대답은 정확히 잘못 아니지만, 그것이 수행해야하는 방식이 아니다
아래

10
그러나 내 프로젝트 이름 "Wildlife League"와 관련이 있으며 공간이 있습니까?
allenlinli

59
베타 4부터는 액세스 제어 설정이 올바른지 확인해야합니다. 테스트중인 클래스와 해당 클래스 내에서 테스트중인 함수를 모두로 명시 적으로 설정해야합니다 public. 그렇지 않으면 XCTestCase서브 클래스는 테스트하려는 것을 "볼"수 없습니다. 나는 :)이 지난 밤에 몇 시간을 낭비
에릭 P. 핸슨에게

2
내가 잘못 아니에요 경우, 제품 모듈 이름 (대상 빌드 설정에서)는 항상 대상의 이름과 동일하지 않습니다 그리고 그것은 사용해야 모듈의 이름입니다 import
csch

3
Swift 대상에 이름에 공백이 있으면 import 문에서 공백을 밑줄로 바꾸어 가져올 수 있습니다. "My Swift Class"는 "My_Swift_Class"가됩니다.
Cin316

70

Swift 2.x, 3.x, 4.x 및 5.x 업데이트

이제 public테스트 할 메소드에 를 추가 할 필요가 없습니다 . 최신 버전의 Swift에서는 @testable키워드 만 추가하면 됩니다.

PrimeNumberModelTests.swift

import XCTest
@testable import MyProject

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()
}

그리고 당신의 내부 방법은 유지할 수 있습니다 Internal

PrimeNumberModel.swift

import Foundation

class PrimeNumberModel {
   init() {
   }
}

을 사용하더라도 private(및 fileprivate) 기호를 사용할 수 없습니다 @testable.


스위프트 1.x

Swift에는 두 가지 관련 개념이 있습니다 (Xcode 6 베타 6).

  1. Swift 클래스를 가져올 필요는 없지만 외부 모듈 (대상)을 가져와야합니다.
  2. Swift 의 기본 액세스 제어 수준은Internal access

테스트가 다른 대상에 있다는 것을 고려할 때 테스트 하려는 클래스가 포함 된 대상 PrimeNumberModelTests.swiftimport대한 대상이 필요 하다는 것을 고려 하십시오. 대상 이 호출 MyProject되면 다음에 추가 import MyProject해야합니다 PrimeNumberModelTests.

PrimeNumberModelTests.swift

import XCTest
import MyProject

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()
}

그러나 PrimeNumberModel기본 액세스 제어 수준이 Internal Access이므로 클래스가 테스트 번들에 표시되지 않으므로 클래스를 테스트하기에 충분하지 않으므로 클래스 Public Access와 테스트하려는 모든 메소드 를 작성해야합니다 .

PrimeNumberModel.swift

import Foundation

public class PrimeNumberModel {
   public init() {
   }
}

기본 액세스 제어를 변경하는 방법이 있습니까? 공개 수정자를 사용하지 않고 실행하는 데 재미있는 사례가 있었고 테스트 사례를 옮기고 갑자기 더 이상 작동을 멈췄습니다.
Metaphox

적어도 현재 버전의 스위프트에서는 불가능하다고 생각합니다.
Diogo T

감사. 그리고 내 문제는 신속한 파일이 테스트 사례로 테스트 대상에 빌드되지 않는다는 것입니다.
Metaphox

1
예, 그것은 내가 잘못 느꼈던 곳이었습니다. 클래스 신속한 파일을 테스트 케이스 대상에 빌드해서는 안됩니다. 좋은 블로그 게시물! 감사.
Metaphox

1
Xcode 5 이상으로 만든 프로젝트가 있고 "공용 액세스, 대상 모듈 가져 오기"접근 방식을 선택하는 경우 테스트 대상의 모듈 이름이 기본 대상과 같을 수 있으므로 다시 확인하십시오. 당신이 받고있는 경우 No such module <moduleName>테스트 케이스에 컴파일 오류를 당신은을 확인 할 수 있습니다 PRODUCT_MODULE_NAME테스트 대상에 대해. 큰 답변 Diogo.
Chris

48

에서 문서 는 스위프트에는 import 문이없는 말했다.

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

간단히 사용하십시오 :

let primNumber = PrimeNumberModel()

2
이것은 효과가 있었지만 클래스가 마침내 표시되도록 Xcode 6.0을 닫았다가 다시 열어야했습니다. 프로젝트를 청소하고 빌드하십시오.
user3344977

이것은 최신 XCode 6.3 베타 버전에서 새로운 것으로 보이므로 import 문이 필요합니다. 또한 Swift에는 모듈을 가져 오기위한 import 문이 있습니다.
Augunrik

제공된 문서에 따르면, "가져 오기 문 없음"이있는이 테이블은 "같은 대상에서 가져 오기"사례와 관련이 있습니다. XCTests의 경우 다른 (테스트) 대상을 사용하므로 기사의 "외부 프레임 워크 가져 오기"섹션에 다른 테이블이 있습니다. 모든 언어 프레임 워크-> Swift로 가져 오기-> "FrameworkName"가져 오기가 필요합니다.
Igor Vasilev

편집기에 문제가 있으면 클래스가 포함되지 않은 테스트 대상이있는 경우가 종종 있습니다. 따라서 실행 가능한 벌금을 만들 수 있지만 대상 중 하나에 문제가 있으면 여전히 오류가 표시됩니다. 다른 대상 중 하나를 선택한 경우 컴파일 할 수 없습니다.
Joel Teply

34

테스트 대상에서 PrimeNumberModel.swift의 대상 멤버십을 확인하십시오.


1
이것을 의견으로 추가하십시오.
4dgaurav

8
이 사람은 할 수 없으며 (작성 시점에) 9 명의 담당자가 더 필요합니다.
AlbertEngelB

1
도대체 목표는 무엇입니까?
사용자

고마워 이것은 나를 위해 일했다. 수업 파일을 클릭하십시오. 오른쪽의 인스펙터 열의 첫 번째 탭을 확인하십시오. 두 번째 섹션은 "타겟 멤버십"입니다. 수업을 포함하려는 대상 / 제품이 선택되어 있는지 확인하십시오.
Hairgami_Master

1
그것은 "어떻게 가져 오는가 ..."라는 질문에 대한 답은 아니지만, 내가 여기로 가져온 질문에 대한 답변이었습니다 (대상에 새 파일을 추가하는 것을 잊었습니다). 그래서 저하고 "신속한 해결되지 않은 식별자 클래스"에 대한 최초의 구글 결과에 따라 여기에 도착 다른 사람을 위해,이 입니다 답변 (그리고 주석).
noamtm 2016 년

17

Objective-C에서 다른 파일의 클래스를 사용하려면 클래스를 가져와야합니다.

#import "SomeClass.h"

그러나 Swift에서는 전혀 가져올 필요가 없습니다. 이미 가져온 것처럼 사용하기 만하면됩니다.

// This is a file named SomeClass.swift

class SomeClass : NSObject {

}

// This is a different file, named OtherClass.swift

class OtherClass : NSObject {
    let object = SomeClass()
}

보시다시피 가져 오기가 필요하지 않았습니다. 도움이 되었기를 바랍니다.


감사! 여전히 Swift에서이 모든 새로운 것들을 돌아 다니고 있습니다.
Felipe

5

Apple에 따르면 동일한 대상에서 빠른 파일을 가져 오기 할 필요가 없습니다. 나는 신속한 목표 파일을 일반 대상과 테스트 대상 모두에 추가하여 마침내 작동하게했습니다. 그런 다음 테스트에 브리징 헤더를 사용하여 일반 브리징 헤더에서 참조한 ObjC 파일이 사용 가능한지 확인했습니다. 지금 매력처럼 달렸다.

import XCTest
//Optionally you can import the whole Objc Module by doing #import ModuleName

class HHASettings_Tests: XCTestCase {

override func setUp() {
    let x : SettingsTableViewController = SettingsTableViewController()

    super.setUp()
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

override func tearDown() {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    super.tearDown()
}

func testExample() {
    // This is an example of a functional test case.
    XCTAssert(true, "Pass")
}

func testPerformanceExample() {
    // This is an example of a performance test case.
    self.measureBlock() {
        // Put the code you want to measure the time of here.
    }
}

}

PrimeNumberModel에 테스트 대상의 대상이 있는지 확인하십시오. 또는 전체 모듈을 가져 오는 High6 솔루션이 작동합니다.


이것은 로직 / 모델 클래스에서만 작동합니까, 아니면 애플리케이션 델리게이트에서도 사용할 수 있습니까?
Nicolas Miari

5

빌드를 정리하여이 문제를 해결할 수있었습니다.

톱 메뉴-> 제품-> 청소 또는 키보드 단축키 : Shift+ Cmd+K


4

Swift 2.0 기준으로 모범 사례는 다음과 같습니다.

@testable import MyApp테스트 파일 맨 위에 줄 을 추가하십시오. 여기서 "MyApp"은 앱 대상 의 제품 모듈 이름 입니다 ( 앱 대상의 빌드 설정 에서 볼 수 있음 ). 그게 다야.

(앱 타겟 이름에 공백이 포함되지 않는 한 제품 모듈 이름은 앱 타겟 이름과 동일합니다. 예를 들어 내 앱 타겟이 "재미있는 게임"인 @testable import Fun_Game경우 내 테스트의 상단.)


1

컴파일러가 시작점으로 참조 할 루틴을 추가해야하므로 main.swift 파일을 추가하십시오.이 경우 단순히 테스트 파일의 인스턴스를 작성하십시오.

main.swift

PrimeNumberModelTests()

그런 다음 명령 줄에서 컴파일하십시오 (El ​​Capitan 및 Swift 2.2를 사용하고 있습니다).

xcrun -sdk macosx swiftc -emit-executable -o PrimeNumberMain PrimeNumberModel.swift PrimeNumberModelTests.swift main.swift

이 경우 에는 initializer의 결과가 사용되지 않지만 프로그램이 컴파일되어 실행 가능하다는 경고가 표시 됩니다.

./PrimeNumberMain

주의 사항 : 가져 오기 XCTest 및 XCTestCase 유형을 단순화하기 위해 제거했습니다.


1

PrimeNumberModelTests대상 설정을 확인하십시오 .

PrimeNumberModel.swiftBuild에 파일 이 보이지 않으면 Phases/Compile Sources추가하십시오.


이것은 올바른 방법이 아닙니다. High6 응답을 확인하십시오.
Diogo T

0

따라서, 당신은

  1. 사용하려는 외부 모듈 가져 오기
  2. 또한 사용하려는 클래스 및 메소드에 올바른 액세스 수정자가 있는지 확인하십시오.

필자의 경우 빠른 테스트 파일을 가지고 단위 테스트를 원했고 단위 테스트 파일도 빠른 클래스였습니다. 액세스 수정자가 올바른지 확인했지만 명령문

import stMobile

(stMobile이 목표 이름이라고 가정 해 봅시다)

여전히 작동하지 않습니다 (아직도 'No such module'오류가 발생했습니다). 내 대상을 확인했으며 그 이름은 실제로 stMobile입니다. 그래서 패키징 아래에서 빌드 설정으로 이동하여 제품 모듈 이름을 찾았으며 어떤 이유로 St_Mobile이라고 불렀으므로 수입 명세서를 변경했습니다.

import St_Mobile

( 제품 모듈 이름 )이며 모든 것이 작동했습니다.

요약하자면 다음과 같습니다.

  1. 제품 모듈 이름을 확인하고 단위 테스트 클래스에서 아래의 수입 명세서를 사용하십시오.

    import myProductModuleName
  2. 액세스 수정자가 올바른지 확인하십시오 (클래스 레벨 및 메소드).


0

Swift 컴파일러는 명시적인 가져 오기 대신 .swiftmodule종속성 Swift 라이브러리 파일을 암시 적으로 검색합니다 .

Xcode는 신속한 모듈을 만들거나에 대한 명령 줄 지침 은 railsware 블로그 를 참조하십시오 swiftc.


0

@ high6과 @ erik-p-hansen이 @ high6의 답변에서 지적했듯이 PrimeNumberModel 클래스가있는 모듈의 대상을 가져 와서 극복 할 수 있습니다. 아마도 간단한 프로젝트에서 프로젝트와 같은 이름 일 것입니다 .

이것을 보면서 나는 Clayswift McIlrath의 swiftcast.tv 에서 스위프트 에서 첫 번째 단위 테스트 작성 기사를 보았습니다. 액세스 수정 자에 대해 설명하고 모델 파일이 아닌 ViewController의 경우와 동일한 문제의 예를 보여 주며 대상에 대상 파일을 포함시켜 대상을 가져오고 액세스 수정 자 문제를 해결하는 방법을 보여줍니다. 실제로 테스트하지 않으려는 경우 테스트하려는 클래스를 공개하지 않아도됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.