আমি অন্য একটি সুইফ্ট ফাইল থেকে কীভাবে একটি সুইফ্ট ফাইল আমদানি করব?


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
অ্যাপল ডক্স অনুসারে যখন উভয় ফাইলের লক্ষ্য একই থাকে তখন আপনার আমদানির প্রয়োজন হবে না। দুঃখের বিষয় পরীক্ষার আলাদা লক্ষ্য রয়েছে। আপনার সম্ভাব্য সমাধানটি আপনার মডেল / প্রাইমবারবারমোডেল ব্যবহার করে একটি আমদানি বিবৃতি করা।
অ্যালেক্স রেনল্ডস

@ জোসেফ.হাইনলাইন আমি একই সমস্যার মুখোমুখি। কীভাবে সমাধান হবে? আমি এখন আটকা পড়েছি।
বিকাশকারী

উত্তর:


131

আমার XCTestCaseফাইলগুলির মধ্যেও আমার একই সমস্যা ছিল তবে নিয়মিত প্রকল্পের ফাইলগুলিতে নয়।

পরিত্রাণ পেতে:

অমীমাংসিত সনাক্তকারী 'PrimeNumberModel' এর ব্যবহার

আমার importপরীক্ষার ফাইলে বেস মডিউলটি দরকার ছিল । আমার ক্ষেত্রে, আমার টার্গেটটিকে 'মাইপ্রজেক্ট' বলা হয় এবং আমি যুক্ত করেছি import myprojectএবং শ্রেণিটি স্বীকৃত হয়েছিল।


2
এটির জন্য আরও বেশি পরিমাণের প্রয়োজন। পরীক্ষার টার্গেটে কেবলমাত্র সুইসফিট ফাইল যুক্ত করার পরামর্শ দেওয়া উত্তরগুলি ঠিক ভুল নয়, তবে এটি করা উচিত নয়
নীচে

10
তবে আমার প্রকল্পের নাম "ওয়াইল্ডলাইফ লিগ" এর সাথে কী করবে, যার মধ্যে জায়গা আছে?
অ্যালেনলিলি

59
বিটা 4 দিয়ে শুরু করে, আপনার অ্যাক্সেস নিয়ন্ত্রণ সেটিংসও সঠিক কিনা তাও আপনাকে নিশ্চিত করতে হবে। আপনি যে ক্লাসটি পরীক্ষা করছেন তা এবং সেই শ্রেণীর মধ্যে যে ফাংশনগুলি আপনি পরীক্ষা করছেন সেগুলি উভয়ই আপনাকে স্পষ্ট করতে হবে public। অন্যথায় XCTestCaseসাবক্লাসটি আপনি যা পরীক্ষা করার চেষ্টা করছেন তা "দেখতে" সক্ষম করবে না। আমি এই গত রাতে কয়েক ঘন্টা নষ্ট করেছি :)
এরিক পি। হানসেন

2
যদি আমি ভুল না হয়ে থাকি তবে পণ্য মডিউলটির নাম (লক্ষ্য নির্ধারণের সেটিংসে) সর্বদা import
লক্ষ্যর

3
যদি একটি সুইফ্ট টার্গেটের নামে একটি জায়গা থাকে, আপনি আমদানি বিবৃতিতে আন্ডারস্কোর দিয়ে ফাঁকা স্থান পরিবর্তন করে এটি আমদানি করতে পারেন। "আমার সুইফ্ট ক্লাস" "মাই_উইফট_ক্লাস" হয়ে যায়।
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
যদি আপনার এক্সকোড 5 বা তারপরে কোনও প্রকল্প তৈরি হয়ে থাকে এবং আপনি "জনসাধারণের প্রবেশাধিকার, আমদানির লক্ষ্য মডিউল" পদ্ধতির বিকল্পটি বেছে নিচ্ছেন তবে এটির পরীক্ষার টার্গেটের জন্য মডিউলটির নামটি ডাবল চেক করুন কারণ এটি প্রধান লক্ষ্য হিসাবে একই হতে পারে। আপনি যদি No such module <moduleName>পরীক্ষার ক্ষেত্রে সংকলন ত্রুটিটি পেয়ে থাকেন তবে আপনি PRODUCT_MODULE_NAMEপরীক্ষার লক্ষ্যটির জন্য পরীক্ষা করতে চাইতে পারেন । দুর্দান্ত উত্তর ডায়োগো।
ক্রিস

48

ইন ডকুমেন্টেশন এটা বলে সুইফট কোন আমদানি বিবৃতি আছে।

এখানে চিত্র বর্ণনা লিখুন

সহজভাবে ব্যবহার করুন:

let primNumber = PrimeNumberModel()

2
এটি কাজ করেছে তবে ক্লাসটি শেষ পর্যন্ত দেখাতে আমাকে Xcode 6.0 বন্ধ এবং পুনরায় খুলতে হয়েছিল। প্রকল্পটি পরিষ্কার করার পাশাপাশি নির্মাণ করার চেষ্টা করুন।
user3344977

এটি সর্বশেষতম এক্সকোড .3.৩ বিটাতে নতুন (বা কোনও সমস্যা) বলে মনে হচ্ছে, তাই আমদানি বিবৃতিটি এখন প্রয়োজনীয়। এছাড়াও মডিউল আমদানি করার জন্য সুইফটে একটি আমদানির বিবৃতি রয়েছে।
অগুনরিক ২

সরবরাহকৃত ডকুমেন্টেশন অনুসারে, "কোনও আমদানির বিবৃতি নেই" সহ এই টেবিলটি "একই লক্ষ্য থেকে আমদানি করুন" ক্ষেত্রে সম্পর্কিত। এক্সসিটিস্টের ক্ষেত্রে আপনি পৃথক (পরীক্ষা) লক্ষ্য ব্যবহার করেন, সুতরাং নিবন্ধটির "বহিরাগত কাঠামো আমদানি" বিভাগটি পর্যবেক্ষণ করুন, অন্য একটি সারণী রয়েছে: যে কোনও ভাষার কাঠামো ->
সুইফটে

আপনি যদি সম্পাদকটিতে কোনও সমস্যা দেখতে পান তবে প্রায়শই এটির একটি পরীক্ষার লক্ষ্য থাকে যাতে ক্লাসটি অন্তর্ভুক্ত থাকে না। সুতরাং আপনি সম্ভবত আপনার রানযোগ্যযোগ্য জরিমানাটি তৈরি করেন তবে লক্ষ্যগুলির মধ্যে যদি কোনওর সাথে সমস্যা দেখা দেয় তবে এটি ত্রুটিটি দেখায়। আপনি যদি এই অন্যান্য লক্ষ্যগুলির মধ্যে একটি নির্বাচন করে থাকেন তবে এটি আপনাকে সংকলন করতে দেয় না।
জোয়েল টেপ্লি

34

আপনার পরীক্ষার লক্ষ্যে PrimeNumberModel.swift এর লক্ষ্য-সদস্যতা পরীক্ষা করুন।


1
এটি মন্তব্য হিসাবে যুক্ত করুন।
4dgaurav

8
এই ব্যক্তিটি পারবেন না, এটি করার জন্য তাঁর আরও 9 জন প্রতিনিধি প্রয়োজন (লেখার সময়)।
অ্যালবার্টেঞ্জেলবি

1
হেক একটি লক্ষ্য কি?
ব্যবহারকারী

ধন্যবাদ এটি আমার জন্য কাজ করেছে। ক্লাস ফাইলটিতে ক্লিক করুন। ডানদিকে পরিদর্শক কলামের প্রথম ট্যাবটি দেখুন। দ্বিতীয় বিভাগটি হ'ল "টার্গেট সদস্যতা"। আপনি শ্রেণিটি অন্তর্ভুক্ত করার চেষ্টা করছেন যে লক্ষ্য / পণ্যটি নির্বাচিত হয়েছে তা নিশ্চিত করুন।
হেয়ারগামি_মাস্টার

1
এটি "আমি কীভাবে আমদানি করব ..." - এর প্রশ্নের কঠোর উত্তর নয়, তবে আমার যে প্রশ্নটি এখানে এসেছিল তা উত্তর দিয়েছিল (আমি লক্ষ্যটিতে একটি নতুন ফাইল যুক্ত করতে ভুলে গেছি)। আমার এবং অন্যদের জন্য যারা "সুইফট অমীমাংসিত শনাক্তকারী শ্রেণি" এর জন্য প্রথম গুগল ফলাফল অনুসরণ করে এখানে পৌঁছে যাবেন, এটি একটি উত্তর (এবং কোনও মন্তব্য নয়)।
noamtm

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

}

সুতরাং নিশ্চিত হয়ে নিন যে PrimeNumberModel এর আপনার পরীক্ষার টার্গেটের লক্ষ্য রয়েছে। বা আপনার সম্পূর্ণ মডিউল আমদানির হাই -6 সমাধান কাজ করবে


এটি কি কেবল যুক্তি / মডেল শ্রেণীর জন্য কাজ করে, বা আমি এটি অ্যাপ্লিকেশন ডেলিগেটের জন্যও ব্যবহার করতে পারি?
নিকোলাস মিয়ারি

5

আমি আমার বিল্ডটি পরিষ্কার করে এই সমস্যাটি সমাধান করতে সক্ষম হয়েছি।

শীর্ষস্থানীয় মেনু -> পণ্য -> ক্লিন বা কীবোর্ড শর্টকাট: Shift+ Cmd+K


4

সুইফট ২.০ হিসাবে, সেরা অনুশীলনটি হ'ল:

@testable import MyAppআপনার পরীক্ষার ফাইলের শীর্ষে লাইন যুক্ত করুন, যেখানে "মাই অ্যাপ" আপনার অ্যাপ্লিকেশন টার্গেটের পণ্য মডিউল নাম (আপনার অ্যাপ্লিকেশন টার্গেটের বিল্ড সেটিংসে দৃশ্যমান )। এটাই.

(মনে রাখবেন যে পণ্য মডিউলটির নামটি আপনার অ্যাপ্লিকেশন টার্গেটের নামের মতোই হবে যদি না আপনার অ্যাপ্লিকেশন টার্গেটের নাম ফাঁক থাকে, যা আন্ডারস্কোর দ্বারা প্রতিস্থাপন করা হয় example উদাহরণস্বরূপ, যদি আমার অ্যাপ্লিকেশন টার্গেটটিকে "ফান গেম" বলা হত তবে আমি এখানে লিখতাম @testable import Fun_Game) আমার পরীক্ষার শীর্ষে।)


1

সংকলকটির জন্য একটি এন্ট্রি পয়েন্ট হিসাবে উল্লেখ করার জন্য আপনাকে একটি রুটিন যুক্ত করতে হবে, সুতরাং একটি মেইন.সুইফ্ট ফাইল যুক্ত করুন, যা এই ক্ষেত্রে কেবল আপনার পরীক্ষার ফাইলের উদাহরণ তৈরি করে:

main.swift

PrimeNumberModelTests()

তারপরে কমান্ড লাইনে সংকলন করুন (আমি এল ক্যাপিটান এবং সুইফট ২.২ ব্যবহার করছি):

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

এই ক্ষেত্রে, আপনি একটি সতর্কতা পাবেন: ইনিশিয়ালাইজারের ফলাফলটি অব্যবহৃত থাকলেও প্রোগ্রামটি সংকলন করে এবং কার্যকর হয়:

./PrimeNumberMain

কায়েট: সরলতার জন্য আমি আমদানি করা এক্সসিস্টেস্ট এবং এক্সসিটিস্টেকেস ধরণটি সরিয়েছি।


1

আপনার PrimeNumberModelTestsলক্ষ্য সেটিংস পরীক্ষা করুন ।

আপনি যদি PrimeNumberModel.swiftবিল্ডে ফাইল দেখতে না পান Phases/Compile Sourcesতবে এটি যুক্ত করুন।


এটি করার সঠিক উপায় নয়, হাই 6 প্রতিক্রিয়াটি পরীক্ষা করুন।
ডায়োগো টি

0

সুতরাং, আপনার প্রয়োজন

  1. আপনি যে বাহ্যিক মডিউলগুলি ব্যবহার করতে চান তা আমদানি করুন
  2. এবং ক্লাস এবং আপনি যে পদ্ধতিগুলি ব্যবহার করতে চান তার উপর সঠিক অ্যাক্সেস মডিফায়ার রয়েছে কিনা তা নিশ্চিত করুন।

আমার ক্ষেত্রে আমার একটি সুইফ্ট ফাইল ছিল আমি ইউনিট পরীক্ষা করতে চেয়েছিলাম, এবং ইউনিট পরীক্ষা ফাইলটিও একটি সুইফ্ট ক্লাস ছিল। আমি নিশ্চিত করেছিলাম অ্যাক্সেস মডিফায়ারগুলি সঠিক ছিল, তবে বিবৃতিটি

import stMobile

(আসুন আমরা বলি যে স্টোমোবাইল আমাদের টার্গেটের নাম)

এখনও কার্যকর হয়নি (আমি এখনও 'এরকম কোনও মডিউল' ত্রুটি পাচ্ছিলাম না), আমি আমার লক্ষ্যটি পরীক্ষা করেছিলাম এবং এর নামটি আসলে স্টোমোবাইল। সুতরাং, আমি প্যাকেজিংয়ের অধীনে, সেটিংস তৈরি করতে গিয়ে প্রোডাক্ট মডিউলটির নাম পেয়েছি এবং কোনও কারণে এটিকে স্ট_মোবাইল বলা হয়েছিল, তাই আমি আমার আমদানির বিবৃতি পরিবর্তন করেছি

import St_Mobile

(যা পণ্য মডিউল নাম ) এবং সবকিছু কাজ করে everything

সুতরাং, সংক্ষেপে:

  1. আপনার পণ্য মডিউল নাম পরীক্ষা করুন এবং নীচে আপনার ইউনিট পরীক্ষা শ্রেণিতে আমদানি বিবৃতি ব্যবহার করুন

    import myProductModuleName
  2. আপনার অ্যাক্সেস সংশোধকগুলি সঠিক (শ্রেনীর স্তর এবং আপনার পদ্ধতি) সঠিক কিনা তা নিশ্চিত করুন।


0

সুস্পষ্ট আমদানির প্রয়োজনের পরিবর্তে, সুইফট সংকলক সুস্পষ্টভাবে .swiftmoduleনির্ভরতা সুইফট লাইব্রেরির ফাইলগুলি অনুসন্ধান করে।

এক্সকোড আপনার জন্য সুইফ্ট মডিউল তৈরি করতে পারে, বা কমান্ড লাইন নির্দেশাবলীর জন্য রেলসওয়ার ব্লগটি উল্লেখ করতে পারে swiftc


0

@ হাই 6 এবং @ এরিক-পি-হানসেন @ হাই 6 এর দেওয়া উত্তরে উল্লেখ করেছেন যে, প্রাইমনিবারমোডেল ক্লাসটি যেখানে মডিউলটির জন্য সম্ভবত এটির একই নাম সম্ভবত মডেলটির জন্য লক্ষ্যটি আমদানি করে এটি অতিক্রম করা যায় can ।

এটি দেখার সময়, আমি নিবন্ধটি জুড়ে এসেছিলাম আপনার প্রথম ইউনিট টেস্ট লিখুন সুইফট অন ​​swiftcast.tv দ্বারা ক্লেটন ম্যাকিলারথ দ্বারা। এটি অ্যাক্সেস মডিফায়ারগুলি নিয়ে আলোচনা করে, আপনার যে একই সমস্যা রয়েছে তার উদাহরণ দেখায় (তবে মডেল ফাইলের চেয়ে ভিউকন্ট্রোলারের ক্ষেত্রে) এবং লক্ষ্য কীভাবে গন্তব্য ফাইলটি অন্তর্ভুক্ত করে অ্যাক্সেস মডিফায়ারের সমস্যা উভয়কে কীভাবে সমাধান করতে হবে তা বোঝায় আপনি যে ক্লাসটি জনসাধারণের জন্য পরীক্ষা করার চেষ্টা করছেন তা তৈরি করতে হবে না যতক্ষণ না আপনি বাস্তবে এটি না করতে চান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.