मैं दूसरी स्विफ्ट फ़ाइल से स्विफ्ट फ़ाइल कैसे आयात करूं?


154

मैं बस अपने स्विफ्ट वर्ग को एक अन्य फ़ाइल से शामिल करना चाहता हूं, जैसे कि इसका परीक्षण

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
ऐप्पल डॉक्स के अनुसार जब दोनों फाइलों का एक ही लक्ष्य होता है तो आपको एक आयात की आवश्यकता नहीं होती है। दुखद परीक्षणों में एक अलग लक्ष्य है। एक संभव समाधान हो सकता है कि आप अपनेModule / PrimeNumberModel का उपयोग करके एक आयात विवरण करें।
एलेक्स रेनॉल्ड्स

@ joseph.hainline मैं उसी मुद्दे का सामना कर रहा हूं। इसका समाधान कैसे होगा? मैं अब फंस गया हूं।
डेवलपर

जवाबों:


131

मेरी भी यही समस्या थी, मेरी XCTestCaseफाइलों में भी , लेकिन नियमित प्रोजेक्ट फाइलों में नहीं।

से छुटकारा पाने के लिए:

अनसुलझे पहचानकर्ता 'PrimeNumberModel' का उपयोग

मुझे importटेस्ट फाइल में बेस मॉड्यूल की जरूरत थी । मेरे मामले में, मेरे लक्ष्य को 'मायप्रोजेक्ट' कहा जाता है और मैंने जोड़ा import myprojectऔर वर्ग को मान्यता दी गई।


2
इसके लिए अधिक उर्जा की जरूरत है। केवल .swift फ़ाइल को परीक्षण लक्ष्य में जोड़ने की सलाह देने वाले उत्तर बिल्कुल गलत नहीं हैं, लेकिन यह तरीका ऐसा नहीं होना चाहिए
नीचे

10
लेकिन मेरे प्रोजेक्ट नाम "वाइल्डलाइफ लीग" के साथ क्या करना है, जिसमें जगह है?
एलनिनली

59
बीटा 4 के साथ शुरू, आपको यह सुनिश्चित करने की भी आवश्यकता होगी कि आपकी पहुंच नियंत्रण सेटिंग्स सही हैं। आपको अन्वेषण करने की आवश्यकता होगी कि आप जिस वर्ग का परीक्षण कर रहे हैं और उस कक्षा में आपके द्वारा किए जा रहे कार्य दोनों को सेट करें public। अन्यथा XCTestCaseउप-वर्ग आपके परीक्षण को "देखने" में सक्षम नहीं होगा। मैंने कल रात इस पर कुछ घंटे बर्बाद किए :)
एरिक पी। हैंसेन

2
यदि मैं गलत नहीं हूं, तो उत्पाद मॉड्यूल नाम (लक्ष्य निर्माण सेटिंग्स में) हमेशा लक्ष्य के नाम के समान नहीं होता है और यह मॉड्यूल का नाम है जिसे importबयान में इस्तेमाल किया जाना चाहिए
सीएसएच

3
यदि स्विफ्ट लक्ष्य के नाम में एक स्थान है, तो आप आयात स्टेटमेंट में अंडरस्कोर के साथ रिक्त स्थान को बदलकर इसे आयात कर सकते हैं। "माय स्विफ्ट क्लास" "My_Swift_Class" बन जाता है।
Cin316

70

अद्यतन स्विफ्ट 2.x, 3.x, 4.x और 5.x

अब आपको publicपरीक्षण करने के तरीकों को जोड़ने की आवश्यकता नहीं है । स्विफ्ट के नए संस्करणों पर केवल @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

यहां स्विफ्ट से दो प्रासंगिक अवधारणाएं हैं (एक्सकोड 6 बीटा 6 के रूप में)।

  1. आपको स्विफ्ट कक्षाएं आयात करने की आवश्यकता नहीं है, लेकिन आपको बाहरी मॉड्यूल (लक्ष्य) आयात करने की आवश्यकता है
  2. स्विफ्ट में डिफ़ॉल्ट एक्सेस कंट्रोल स्तर हैInternal access

ध्यान में रखते हुए पर कि परीक्षण एक और लक्ष्य पर हैं PrimeNumberModelTests.swiftआप की जरूरत है importलक्ष्य उस वर्ग होता है, जो, परीक्षण करना चाहते हैं तो अपने लक्ष्य कहा जाता है 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() {
   }
}

क्या डिफ़ॉल्ट एक्सेस कंट्रोल को बदलने का कोई तरीका है? मेरे पास एक मजेदार मामला था कि यह बिना सार्वजनिक संशोधन के ठीक चलता था, फिर मैंने परीक्षण के मामलों को इधर-उधर कर दिया, इसने अचानक काम करना बंद कर दिया।
मेटाफॉक्स

मुझे लगता है कि यह संभव नहीं है, कम से कम स्विफ्ट के वर्तमान संस्करण के लिए।
दिगो टी

धन्यवाद। और मुझे पता चला कि मेरी समस्या यह थी कि स्विफ्ट फ़ाइल परीक्षण मामलों के साथ परीक्षण लक्ष्य के लिए निर्मित नहीं है।
मेटाफॉक्स

1
हां, यह बिल्कुल वही था जहां मुझे गलत लगा - मुझे क्लास स्विफ्ट फाइल को टेस्ट केस टारगेट में नहीं बनाना चाहिए। अच्छी ब्लॉग पोस्ट! धन्यवाद।
मेटाफॉक्स सिप

1
यदि आपके पास Xcode 5 या उसके बाद की कोई परियोजना है और आप "सार्वजनिक पहुंच, आयात लक्ष्य मॉड्यूल" दृष्टिकोण का विकल्प चुन रहे हैं, तो अपने परीक्षण लक्ष्य के लिए मॉड्यूल का नाम जांचें क्योंकि यह मुख्य लक्ष्य के समान हो सकता है। यदि आप No such module <moduleName>अपने परीक्षण के मामले में एक संकलन त्रुटि प्राप्त कर रहे हैं, तो आप PRODUCT_MODULE_NAMEपरीक्षण लक्ष्य के लिए जाँच करना चाहते हैं । शानदार जवाब दिओगो।
क्रिस

48

में प्रलेखन यह कहता है कि स्विफ्ट में कोई आयात बयान कर रहे हैं।

यहाँ छवि विवरण दर्ज करें

बस उपयोग करें:

let primNumber = PrimeNumberModel()

2
यह काम किया लेकिन मुझे Xcode 6.0 को फिर से बंद करना पड़ा और कक्षा के लिए फिर से दिखाना पड़ा। साथ ही प्रोजेक्ट की सफाई और निर्माण का प्रयास करें।
user3344977

ऐसा प्रतीत होता है कि नवीनतम XCode 6.3 बीटा में नया (या एक मुद्दा) है, इसलिए आयात का बयान अभी पेचीदा है। मॉड्यूल आयात करने के लिए स्विफ्ट में एक आयात विवरण भी है।
Augunrik

प्रदान किए गए प्रलेखन के अनुसार, "नो इम्पोर्ट स्टेटमेंट" वाली यह तालिका "समान लक्ष्य से आयात" मामले से संबंधित है। XCTests के मामले में आप अलग-अलग (परीक्षण) लक्ष्य का उपयोग करते हैं, इसलिए लेख के "आयात करने वाले बाहरी फ्रेमवर्क" अनुभाग का निरीक्षण करें, एक और तालिका है: किसी भी भाषा की रूपरेखा -> स्विफ्ट में आयात -> आयात "फ्रेमवर्कनाम" की आवश्यकता है
इगोर वासुदेव

यदि आप संपादक में कोई समस्या देखते हैं, तो अक्सर ऐसा होता है कि एक परीक्षण लक्ष्य है जिसमें कक्षा शामिल नहीं है। तो आप शायद अपने रन करने योग्य फाइन का निर्माण करते हैं, लेकिन यदि किसी एक लक्ष्य में कोई समस्या है, तो यह अभी भी त्रुटि दिखाता है। यदि आपने उन अन्य लक्ष्यों में से एक को चुना था, तो यह आपको संकलित नहीं होने देगा।
जोएल टेप्ली

34

अपने परीक्षण लक्ष्य में PrimeNumberModel.swift की लक्ष्य-सदस्यता की जाँच करें।


1
कृपया इसे टिप्पणी के रूप में जोड़ें।
4dgaurav

8
यह व्यक्ति ऐसा नहीं कर सकता है, उसे ऐसा करने के लिए 9 और प्रतिनिधि चाहिए (लेखन के समय)।
अल्बर्टबेंगल

1
एक लक्ष्य क्या है?
उपयोगकर्ता

धन्यवाद यह मेरे लिए काम किया। वर्ग फ़ाइल पर क्लिक करें। दाईं ओर इंस्पेक्टर कॉलम के पहले टैब की जाँच करें। दूसरा खंड "लक्ष्य सदस्यता" है। सुनिश्चित करें कि जिस कक्षा को चुना गया है, उसे लक्षित / उत्पाद आप चुन रहे हैं।
हेयरगामी_मास्टर

1
यह कड़ाई से इस सवाल का जवाब नहीं है कि "मैं कैसे आयात करता हूं ...", लेकिन इसने उस सवाल का जवाब दिया जो मुझे यहां लाया था (मैं लक्ष्य में एक नई फ़ाइल जोड़ना भूल गया था)। तो मुझे, और दूसरों है कि "तेज अनसुलझे पहचानकर्ता वर्ग" के लिए पहले गूगल परिणाम का पालन करके यहाँ आ जाएगा के लिए, यह है एक जवाब (और नहीं एक टिप्पणी)।
नोआतम

17

ऑब्जेक्टिव-सी में, यदि आप किसी अन्य फ़ाइल में एक वर्ग का उपयोग करना चाहते हैं, तो आपको इसे आयात करना होगा:

#import "SomeClass.h"

हालाँकि, स्विफ्ट में, आपको बिल्कुल आयात नहीं करना है। बस इसे उपयोग करें जैसे कि यह पहले से ही आयात किया गया था।

उदाहरण

// This is a file named SomeClass.swift

class SomeClass : NSObject {

}

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

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

जैसा कि आप देख सकते हैं, किसी भी आयात की आवश्यकता नहीं थी। उम्मीद है की यह मदद करेगा।


धन्यवाद! अभी भी स्विफ्ट से यह सब नया सामान मिल रहा है।
फेलिप

5

ऐप्पल के अनुसार आपको समान लक्ष्य में स्विफ्ट फ़ाइलों के लिए आयात की आवश्यकता नहीं है। मैंने आखिरकार अपने स्विफ्ट फ़ाइल को अपने नियमित लक्ष्य और परीक्षण लक्ष्य दोनों में जोड़कर काम करना शुरू कर दिया। फिर मैंने परीक्षण के लिए ब्रिजिंग हेडर का उपयोग यह सुनिश्चित करने के लिए किया कि मेरी ओबजैक फाइलें जो मैंने अपने नियमित ब्रिजिंग हेडर में संदर्भित की हैं, उपलब्ध थीं। अब एक आकर्षण की तरह भाग गया।

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

}

SO सुनिश्चित करें कि PrimeNumberModel के पास आपके परीक्षण का लक्ष्य है। या अपने पूरे मॉड्यूल को आयात करने का High6 समाधान काम करेगा


क्या यह केवल तर्क / मॉडल कक्षाओं के लिए काम करता है, या क्या मैं इसे अनुप्रयोग प्रतिनिधि के लिए भी उपयोग कर सकता हूं?
निकोलस मिआरी

5

मैं अपनी बिल्ड को साफ करके इस समस्या को हल करने में सक्षम था।

शीर्ष मेनू -> उत्पाद -> स्वच्छ या कीबोर्ड शॉर्टकट: Shift+ Cmd+K


4

स्विफ्ट 2.0 के अनुसार, सबसे अच्छा अभ्यास है:

@testable import MyAppअपनी परीक्षण फ़ाइल के शीर्ष पर उस पंक्ति को जोड़ें , जहाँ "MyApp" आपके एप्लिकेशन लक्ष्य का उत्पाद मॉड्यूल नाम है (आपके ऐप लक्ष्य की निर्माण सेटिंग में देखने योग्य )। बस।

(ध्यान दें कि उत्पाद मॉड्यूल नाम आपके ऐप लक्ष्य के नाम के समान होगा जब तक कि आपके ऐप लक्ष्य के नाम में रिक्त स्थान न हों, जिन्हें अंडरस्कोर से बदल दिया जाएगा। उदाहरण के लिए, यदि मेरे ऐप लक्ष्य को "फन गेम" कहा जाता है, तो मैं लिखूंगा @testable import Fun_Game। मेरे परीक्षणों में से सबसे ऊपर।)


1

आपको एक प्रविष्टि बिंदु के रूप में संदर्भ के लिए कंपाइलर के लिए एक दिनचर्या जोड़ने की आवश्यकता है, इसलिए एक main.swift फ़ाइल जोड़ें, जो इस मामले में बस आपकी परीक्षण फ़ाइल का एक उदाहरण बनाता है:

main.swift

PrimeNumberModelTests()

फिर कमांड लाइन पर संकलित करें (मैं एल कैपिटन और स्विफ्ट 2.2 का उपयोग कर रहा हूं):

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

इस मामले में, आपको एक चेतावनी मिलेगी: आरंभीकरण का परिणाम अप्रयुक्त है , लेकिन कार्यक्रम संकलन और निष्पादन योग्य है:

./PrimeNumberMain

गुफा: मैंने सादगी के लिए आयात XCTest और XCTestCase प्रकार को हटा दिया।


1

अपनी PrimeNumberModelTestsलक्ष्य सेटिंग जांचें ।

यदि आप PrimeNumberModel.swiftफ़ाइल को बिल्ड में नहीं देख सकते हैं Phases/Compile Sources, तो उसे जोड़ें।


यह करने का सही तरीका नहीं है, High6 प्रतिक्रिया की जांच करें।
डियागो टी

0

तो, आपको करने की आवश्यकता है

  1. बाहरी मॉड्यूल्स आयात करें जिनका आप उपयोग करना चाहते हैं
  2. और सुनिश्चित करें कि आपके पास कक्षा और उन तरीकों पर सही पहुँच संशोधक हैं, जिनका आप उपयोग करना चाहते हैं।

मेरे मामले में मेरे पास एक स्विफ्ट फाइल थी जिसे मैं यूनिट टेस्ट करना चाहता था, और यूनिट टेस्ट फाइल भी एक स्विफ्ट क्लास थी। मैंने सुनिश्चित किया कि पहुंच संशोधक सही थे, लेकिन वक्तव्य

import stMobile

(मान लें कि stMobile हमारा लक्षित नाम है)

अभी भी काम नहीं किया (मैं अभी भी 'इस तरह का कोई मॉड्यूल नहीं' त्रुटि प्राप्त कर रहा था), मैंने अपना लक्ष्य जांचा, और इसका नाम वास्तव में stMobile था। इसलिए, मैं पैकेजिंग के तहत, बिल्ड सेटिंग्स में गया, और उत्पाद मॉड्यूल नाम पाया, और किसी कारण से इसे St_Mobile कहा जाता था, इसलिए मैंने अपना आयात विवरण बदल दिया

import St_Mobile

(जो उत्पाद मॉड्यूल नाम है ), और सब कुछ काम किया।

इसलिए योग करने के लिए:

  1. अपने उत्पाद मॉड्यूल नाम की जाँच करें और आप इकाई परीक्षण वर्ग में नीचे दिए गए आयात विवरण का उपयोग करें

    import myProductModuleName
  2. सुनिश्चित करें कि आपके एक्सेस संशोधक सही हैं (वर्ग स्तर और आपके तरीके)।


0

स्पष्ट आयात की आवश्यकता के बजाय, स्विफ्ट कंपाइलर .swiftmoduleनिर्भरता स्विफ्ट पुस्तकालयों की फ़ाइलों के लिए निहित है।

Xcode आपके लिए स्विफ्ट मॉड्यूल का निर्माण कर सकता है, या कमांड लाइन निर्देशों के लिए रेलवेयर ब्लॉग का संदर्भ ले सकता है swiftc


0

जैसा कि @ high6 और @ erik-p-hansen ने @ high6 द्वारा दिए गए उत्तर में बताया, यह मॉड्यूल के लिए लक्ष्य को आयात करके दूर किया जा सकता है जहां PrimeNumberModel वर्ग है, जो संभवतः एक साधारण परियोजना में आपकी परियोजना के समान नाम है ।

इसे देखते हुए, मैं क्लाईटन मैक्रीथ द्वारा स्विफ्टस्टेड.क्यू पर स्विफ्ट में अपना पहला यूनिट टेस्ट लिखें । यह एक्सेस मॉडिफ़ायर पर चर्चा करता है, उसी समस्या का एक उदाहरण दिखाता है जो आपको हो रही है (लेकिन एक मॉडल फ़ाइल के बजाय एक ViewController के लिए) और दिखाता है कि दोनों कैसे लक्ष्य को आयात करते हैं और लक्ष्य फ़ाइल में गंतव्य फ़ाइल को शामिल करके पहुँच संशोधक समस्या को हल करते हैं, अर्थ जब तक आप वास्तव में ऐसा नहीं करना चाहते, तब तक आपको वह वर्ग बनाने की ज़रूरत नहीं है, जिसे आप सार्वजनिक रूप से परखने की कोशिश कर रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.