সুইফটে নেমস্পেস কীভাবে ব্যবহার করবেন?


144

ডকুমেন্টেশনে কেবল নেস্টেড ধরণের উল্লেখ রয়েছে তবে সেগুলি স্পেস হিসাবে স্পষ্ট নয় যে তারা নামস্থান হিসাবে ব্যবহার করতে পারে। নেমস্পেসের কোনও সুস্পষ্ট উল্লেখ আমি পাইনি।


তাদের আই-বুকের একটি তাত্ক্ষণিক সিটিআরএল-এফ অনুসন্ধান নেমস্পেসের কোনও দৃষ্টান্ত দেখায় না ... তাই আমি কোন সাথে যাচ্ছি না?
জাস্টিন নিসনার

1
আমি জানি না কেন এই প্রশ্নটি বন্ধ রয়েছে। আমি সুইফট আইকনটির বাম দিকে মূল বক্তব্যে নেমস্পেসটি দেখেছি , এবং এখনও ডকুমেন্টেশন থেকে কোনও উল্লেখ পাই না ...
এওনিল

আমি এ সম্পর্কিত কোনও তথ্য খুঁজে পাইনি, গুগল আমাকে এই প্রশ্নে নিয়ে গেছে :)। সম্ভবত ডাব্লুডব্লিউডিসির একটি সেশন এ সম্পর্কে আরও কিছুটা আলোকপাত করবে।
জিফ্রাক্স

আমি ডাব্লুডাব্লুডিসিতে কারও সুন্দর ব্যাখ্যা নিয়ে আসার অপেক্ষায় রয়েছি।
ইওনিল

ইউনিলের উত্তরটি সঠিক। আপনি আপনার ক্লাস পৃথক করতে এক্সকোডে মডিউল ব্যবহার করেন।
জিফ্রাক্স

উত্তর:


113

উত্তর SevenTenEleven মধ্যে অ্যাপল দেব ফোরাম :

নেমস্পেসগুলি প্রতি ফাইল হিসাবে নয়; তারা প্রতি লক্ষ্য ("পণ্য মডিউল নাম" বিল্ড সেটিংস উপর ভিত্তি করে) হয়। সুতরাং আপনি এই জাতীয় কিছু দিয়ে শেষ করতে চাই:

import FrameworkA
import FrameworkB

FrameworkA.foo()

সমস্ত সুইফ্ট ঘোষণাকে কিছু মডিউলের অংশ হিসাবে বিবেচনা করা হয়, সুতরাং আপনি " NSLog" বলার পরেও (হ্যাঁ, এটি এখনও বিদ্যমান) আপনি সুইফটকে " Foundation.NSLog" হিসাবে যা ভাবেন তাই পেয়ে যাচ্ছেন ।

এছাড়াও ক্রিস ল্যাটনার নেমস্পেসিংয়ের বিষয়ে টুইট করেছেন

নেমস্পেসিং সুইফটে অন্তর্নিহিত, সমস্ত ক্লাস (ইত্যাদি) মডিউল (এক্সকোড লক্ষ্য) এর মধ্যে রয়েছে সেগুলি স্পষ্টভাবে স্কোপ করা হয় no কোনও শ্রেণির উপসর্গের প্রয়োজন নেই

আমি যা ভাবছিলাম তা খুব আলাদা বলে মনে হচ্ছে।


6
অ্যাপল দেব ফোরাম ... আমি এত গণ্ডগোল করে দেখেছি আপনি বিশ্বাস করবেন না!
নিকোলাস মিয়ারি

1
forums.developer.apple.comদুর্ভাগ্যক্রমে, অ্যাপল দেব ফোরামগুলির লিঙ্কটি এখন ভেঙে গেছে এবং অ্যাপল সেই থ্রেডটি নতুন ফোরাম সাইটে আমদানি করতে পারেনি ।
দাই

2
@ ডাই মনে হচ্ছে এজন্য আমাদের প্রশ্নোত্তর জন্য অ্যাপল ফোরামগুলি এড়ানো উচিত ... তবে মূল দেব দলের সদস্যরা এসও তেমন যত্ন নেবেন বলে মনে হয় না। কি মর্মান্তিক ঘটনা।
ইওনিল

1
আপনি গলদ থেকে কি বোঝাতে চান?
আলেকজান্ডার মিলস

148

আমি সুইফ্টের নেমস্পেসিকে উচ্চাকাঙ্ক্ষী হিসাবে বর্ণনা করব; এটিকে প্রচুর বিজ্ঞাপন দেওয়া হয়েছে যা মাটির কোনও অর্থবহ বাস্তবতার সাথে মিল নয়।

উদাহরণস্বরূপ, ডাব্লুডাব্লুডিসি ভিডিওতে বলা আছে যে আপনি যে ফ্রেমওয়ার্কটি আমদানি করছেন তাতে যদি ক্লাস মাইক্লাস থাকে এবং আপনার কোডটিতে একটি ক্লাস মাইক্লাস থাকে তবে সেই নামগুলি বিরোধী হয় না কারণ "নাম মাঙ্গলিং" তাদের বিভিন্ন অভ্যন্তরীণ নাম দেয়। প্রকৃতপক্ষে, যাইহোক, তারা কি দ্বন্দ্ব অর্থে, যে আপনার নিজের কোডের MyClass জয়ী, এবং আপনি নির্দিষ্ট করতে পারেন না "না না, আমি কাঠামোর মধ্যে MyClass মানে" - এই বলে TheFramework.MyClassকাজ নেই (কম্পাইলার জানেন তোমরা কি মানে , তবে এটি বলে যে এটি ফ্রেমওয়ার্কে এ জাতীয় শ্রেণি খুঁজে পাচ্ছে না)।

আমার অভিজ্ঞতা হ'ল সুইফট অতএব সামান্যতম ক্ষেত্রেও নামগতির নয়। আমার কোন অ্যাপ্লিকেশনটিকে ওজেক্টিভ-সি থেকে সুইফ্টে পরিণত করার সময়, আমি একটি এম্বেডযুক্ত কাঠামো তৈরি করেছি কারণ এটি করা খুব সহজ এবং দুর্দান্ত ছিল। ফ্রেমওয়ার্কটি আমদানি করা যাইহোক, ফ্রেমওয়ার্কে সমস্ত সুইফ্ট স্টাফ আমদানি করে - সুতরাং পূর্ববর্তী, আবার একবার মাত্র একটি নাম স্থান আছে এবং এটি বিশ্বব্যাপী। এবং কোনও সুইফ্ট শিরোনাম নেই তাই আপনি কোনও নাম গোপন করতে পারবেন না।

সম্পাদনা: বীজ 3 তে, এই বৈশিষ্ট্যটি এখন নিম্নোক্ত অর্থে অনলাইনে আসতে শুরু করেছে: যদি আপনার মূল কোডটিতে মাই ক্লাস থাকে এবং আপনার ফ্রেমওয়ার্কটি মাইফ্রেমে ওয়ার্কে মাইক্লাস থাকে তবে প্রাক্তনটি পূর্ববর্তী ডিফল্টটিকে ছাপিয়ে দেয় তবে আপনি ফ্রেমওয়ার্কের মধ্যে একটিতে পৌঁছতে পারেন সিনট্যাক্স ব্যবহার করে MyFramework.MyClass। সুতরাং আমরা আসলে একটি স্বতন্ত্র নাম স্থানের rudimements আছে!

সম্পাদনা 2: 4 বীজে, এখন আমাদের অ্যাক্সেস নিয়ন্ত্রণ রয়েছে! এছাড়াও, আমার অ্যাপ্লিকেশনগুলির একটিতে আমার একটি এম্বেডড ফ্রেমওয়ার্ক রয়েছে এবং এটি যথেষ্ট নিশ্চিত, সমস্ত কিছু ডিফল্টরূপে লুকানো ছিল এবং আমাকে পাবলিক এপিআইয়ের সমস্ত বিট স্পষ্টভাবে প্রকাশ করতে হয়েছিল। এটি একটি বড় উন্নতি।


4
এই উত্তরের জন্য ধন্যবাদ। এটি কেবল ফ্রেমওয়ার্কগুলির সাথেই নয়, স্ট্যান্ডার্ড লাইব্রেরির সাথেও কাজ করে। উদাহরণস্বরূপ আপনি অ্যারে "ওভাররাইট" করতে পারেন। তারপরে "অ্যারে" আপনার নিজস্ব কাস্টম অ্যারে শ্রেণিকে বোঝায় এবং স্ট্যান্ডার্ড লাইব্রেরির অ্যারে "সুইফ্ট.আররে" হিসাবে উপলব্ধ।
জর্জ

3
@ জর্জ এবং একইভাবে এনএসআরির জন্য; আপনি যদি এটি ছায়াছবি করেন তবে আপনি এখনও এটি হিসাবে উল্লেখ করতে পারেন Foundation.NSArray
ম্যাট

1
সুতরাং বেতাসে নামের জায়গাগুলি নিয়ে চিন্তার ইতিহাসটি সন্ধান না করে: এখন এই উত্তরটি কোথায় দাঁড়াবে?
ড্যান রোজনস্টার্ক

1
@ ইয়ারগুলি সম্পাদনাগুলিতে বর্ণিত হয়েছে। অস্পষ্টতা থাকলে মডিউলটির নামটি একটি nameচ্ছিক নেমস্পেস, এবং এখন গোপনীয়তা রয়েছে সুতরাং মডিউলটির নাম গোপন করা না থাকলে এবং নাম কোনও ফাইলের মধ্যে সীমাবদ্ধ করা যায় না।
ম্যাট

2
এটি আমাকে দীর্ঘদিন ধরে বিরক্ত করছে, এটি প্রদর্শিত হবে যে অ্যাপল যে দাবি করছে তার কারণে কোনও সুইফ্ট প্রকল্পগুলি একটি উপসর্গ ব্যবহার করা উচিত নয়, তবে এই মুহুর্তে অ্যাক্সেস মোডিফায়ার সহ একটি উপসর্গ এখনও প্রয়োজন। আপনি যখন অ্যাপলের কাঠামোয় প্যাকেজ বা প্রাইভেট ক্লাসগুলির সাথে বিরোধ করবেন না, উদাহরণস্বরূপ স্ট্রিংয়ের জন্য সর্বজনীন ঘোষিত হয়েছে, তবে আপনি এটি আবার বা কোনও নতুন শ্রেণির ঘোষণা দিলে এটি আপনার ব্যবহার শেষ হবে, যদি না আপনি অভ্যাসে না থাকেন এর নামের স্থান সহ সমস্ত শ্রেণীর উল্লেখ করা .... ভাল ইমো নয়।
অস্কার গোমেজ

19

এটি নিয়ে কিছু পরীক্ষা-নিরীক্ষার সময় আমি রুট "প্যাকেজ" প্রসারিত করে তাদের নিজস্ব ফাইলগুলিতে এই "নেমস্পিড" ক্লাসগুলি তৈরি করে শেষ করেছি। নিশ্চিত না যে এটি সর্বোত্তম অনুশীলনের বিরুদ্ধে কিনা বা এর যদি এর কোনও প্রভাব থাকে তবে আমি সচেতন (?)

AppDelegate.swift

var n1 = PackageOne.Class(name: "Package 1 class")
var n2 = PackageTwo.Class(name: "Package 2 class")

println("Name 1: \(n1.name)")
println("Name 2: \(n2.name)")

PackageOne.swift

import Foundation

struct PackageOne {
}

PackageTwo.swift

import Foundation

struct PackageTwo {
}

PackageOneClass.swift

extension PackageOne {
    class Class {
        var name: String
        init(name:String) {
            self.name = name
        }
    }
}

PackageTwoClass.swift

extension PackageTwo {
    class Class {
        var name: String
        init(name:String) {
            self.name = name
        }
    }
}

সম্পাদনা:

সবেমাত্র জানতে পেরেছি যে উপরের কোডগুলিতে "সাবপ্যাকেজ" তৈরি করা আলাদা ফাইল ব্যবহার করা হলে কাজ করবে না। কেউ যদি ইঙ্গিত করতে পারে যে কেন হবে?

উপরোক্ত ফাইলগুলি যুক্ত করা হচ্ছে:

PackageOneSubPackage.swift

import Foundation

extension PackageOne {
    struct SubPackage {
    }
}

PackageOneSubPackageClass.swift

extension PackageOne.SubPackage {
    class Class {
        var name: String
        init(name:String) {
            self.name = name
        }
    }
}

এটি একটি সংকলক ত্রুটি নিক্ষেপ করছে: 'সাবপ্যাকেজ' 'প্যাকেজঅন' এর কোনও সদস্য ধরণের নয়

আমি যদি প্যাকেজঅনসুবপ্যাকেজক্লাস.স্ফিট থেকে কোডটি প্যাকেজঅনসুবপ্যাকেজ.সুইফ্টে স্থানান্তর করি তবে এটি কাজ করে। যে কেউ?

সম্পাদনা 2:

এটি এখনও ঘুরে বেড়ানো এবং খুঁজে পেয়েছে (এক্সকোড 6.1 বিটা 2 এ) যে কোনও ফাইলের প্যাকেজগুলি সংজ্ঞায়িত করে তাদের পৃথক ফাইলগুলিতে বাড়ানো যেতে পারে:

public struct Package {
  public struct SubPackage {
    public struct SubPackageOne {
    }
    public struct SubPackageTwo {
    }
  }
}

আমার ফাইলগুলি এখানে একটি সংক্ষেপে রয়েছে: https://gist.github.com/mikajauhonen/d4b3e517122ad6a132b8


আকর্ষণীয়, আপনার পরীক্ষা কেমন ছিল?
ব্যবহারকারী2727195

2
আপনি "টেস্টিং" বলতে চাইছেন তা নিশ্চিত নন তবে আমি এগিয়ে গিয়ে উপরের কৌশলটি ব্যবহার করে আমার অ্যাপটি তৈরি করতে শুরু করেছি এবং মনে হচ্ছে উপরের আমার এন্ট্রিতে আমি যে সাবধানবাণী যুক্ত করেছি তার সাথে এটি এখন পর্যন্ত ভালভাবে কাজ করছে। আমি এটি বেশিরভাগ ক্ষেত্রে করছি কারণ আমি অন্য কোডগুলিতে আমার কোডটি এইভাবে সংগঠিত করতাম এবং আরও বেশি জ্ঞান সহ কেউ যদি আমার খুব দূরে না যাওয়া পর্যন্ত এটির একটি খারাপ ধারণা বলতে পারে তবে কৃতজ্ঞ হবেন! :)
bWlrYWphdWhvbmVu

1
চালিয়ে যান ... এটিই আমরা চাই ... দুটি ভিন্ন প্যাকেজের মধ্যে একই নাম শ্রেণি থাকতে হবে এবং সেই অনুসারে উল্লেখ করা যেতে পারে (আরও গুরুত্বপূর্ণভাবে আলাদা ফাইলগুলি) এবং যদি এটি কাজ না করে তবে পুরো নেমস্পেসের ধারণাটি একটি ফ্লপ ধারণা ...
ব্যবহারকারী 2727195

নেমস্পেসগুলি হ্যাক করার উপায় হিসাবে "স্ট্রাক্ট" ব্যবহার করে কোনও পার্শ্ব প্রতিক্রিয়া?
অ্যালেক্স নোলাসো

এমনটিই নয় যে পারফরম্যান্সের ক্ষেত্রে আমি এর মুখোমুখি হয়েছি। এক্সকোড (.1.১ জিএম) এমন কিছু বিরল ক্ষেত্রে রয়েছে যেগুলি ধরণের বিদ্যমান নেই বলে অভিযোগ করে তবে আমি বিশ্বাস করি যে এই জাতীয় কোডটিও কাঠামোগত না করার সময় এটি হতে পারে। আমি সম্প্রতি আমার টেস্ট-টার্গেটে সমস্ত ফাইল যুক্ত করে একটি সমস্যা সমাধান করেছি যা কোনও ধারণা দেয় না তবে এটি সমস্যার সমাধান করে। :)
bWlrYWphdWhvbmVu

12

আমি বিশ্বাস করি এটি ব্যবহার করে এটি অর্জন করা হয়েছে:

struct Foo
{
    class Bar
    {
    }
}

তারপরে এটি ব্যবহার করে অ্যাক্সেস করা যায়:

var dds = Foo.Bar();

1
নেমস্পেসগুলি যেভাবে করা হচ্ছে তাতে আমি এখনও সন্তুষ্ট নই ... আমি যদি একটি নেমস্পেসে দশটি বিভিন্ন ক্লাস করে থাকি এবং তারপরে আমি তাদের পৃথক ফাইলে ক্লাস রাখতে পছন্দ করি তবে কোনটি ফুলতে চাই না ফাইল / কাঠামো সব শ্রেণীর সাথে, কোনও পরামর্শ কেভিন।
ব্যবহারকারী2727195

2
আমি অবাক হয়েছি কেন তারা প্যাকেজগুলি অন্তর্ভুক্ত করার জন্য ভাবেন নি, এটি আমাদের দরকার, নামস্থানগুলি নয়, আমি জাভা, সি #, অ্যাকশনস্ক্রিপ্টের মতো অন্যান্য উচ্চ স্তরের ভাষাগুলির দিকে নজর দিন, এগুলির সমস্ত প্যাকেজ রয়েছে, এই প্রসঙ্গে নামস্থান এনএস ব্যবহার করা থেকে আলাদা কিছু নয় is বা আপনার প্রকল্পের ক্লাসের জন্য অন্যান্য উপসর্গ
user2727195

1
নেমস্পেসগুলি হ্যাক করার উপায় হিসাবে স্ট্র্ট ব্যবহার করা অজানা সমস্যার কারণ হতে পারে তা ভাবতে সহায়তা করতে পারেন।
অ্যালেক্স নোলাসো

1
এটি এর জন্য দুর্দান্ত কাজ ar আমি এই পদ্ধতির ব্যবহার করার চেষ্টা করেছি কিন্তু অবিলম্বে থামতে হয়েছিল stop যখন আমি আমার দর্শন সম্পর্কিত ক্লাসের নাম স্পেস করার চেষ্টা করলাম (কাস্টম টেবিলভিউসেল বলি), ইন্টারফেস বিল্ডারের স্বয়ংক্রিয়রূপ এটি প্রস্তাব দেয় নি। আমি যদি এই পদ্ধতির ব্যবহার করে থাকি তবে আমি নিজেই ক্লাসের নামটি দর্শনের জন্য অনুলিপি করে কপি করতে হত।
আরজি

1
সাধারণত আপনি একটি ব্যবহার করেন enum, ক না struct, তাই আপনি এটিকে ইনস্ট্যান্ট করতে পারবেন না Foo
কেভিন

7

সুইফট অজগরগুলির মতো অনেকগুলি মডিউল ব্যবহার করে ( এখানে এবং এখানে দেখুন ) এবং @ কেভিন সিলভেস্টারের পরামর্শ অনুসারে আপনি নেস্টেড প্রকারগুলি নেমস্পেস হিসাবেও ব্যবহার করতে পারেন ।

এবং উত্তর ড্যানিয়েল এ হোয়াইট এর উত্তর বাড়ানোর জন্য, ডাব্লুডাব্লুডিসিতে তারা দ্রুত মডিউলগুলি নিয়ে কথা বলছিলেন।

এছাড়াও এখানে ব্যাখ্যা করা হয়:

অনুমিত প্রকারগুলি কোড ক্লিনার এবং ভুলগুলির জন্য কম প্রবণ করে তোলে, যখন মডিউলগুলি শিরোনামগুলি সরিয়ে দেয় এবং নেমস্পেস সরবরাহ করে।


2
আমি আপনার দ্বিতীয় লিঙ্কে উল্লিখিত কনস্ট্রাক্টের মতো প্যাকেজগুলি সন্ধান করছি .4.৪ প্যাকেজ (পাইথন), নেস্টেড টাইপ হিসাবে নেমস্পেসগুলি খুব বেশি দূরে নিতে পারে না, যদি আমি ১০ টি আলাদা ক্লাস এবং বিভিন্ন ফাইলের একটি নেমস্পেসে থাকি বা বলি একটি প্যাকেজ ???
ব্যবহারকারী2727195

7
  • যখন আপনাকে বিদ্যমান ফ্রেমওয়ার্কে ক্লাস হিসাবে একই নামের সাথে বর্গ নির্ধারণ করতে হবে তখন নেমস্পেসগুলি দরকারী ।

  • মনে করুন আপনার অ্যাপটির MyAppনাম রয়েছে এবং আপনার কাস্টমটি আপনাকে ঘোষণা করতে হবে UICollectionViewController

আপনি প্রয়োজন হবে না প্রিফিক্স এবং এই মত উপশ্রেণী করুন:

class MAUICollectionViewController: UICollectionViewController {}

এটা এভাবে করো:

class UICollectionViewController {} //no error "invalid redeclaration o..."

কেন? । কারণ আপনি যা ঘোষণা করেছেন তা বর্তমান মডিউলে ঘোষণা করা হয়েছে যা আপনার বর্তমান লক্ষ্য । এবং মডিউল UICollectionViewControllerথেকে UIKitঘোষণা করা হয় UIKit

এটি বর্তমান মডিউলটির মধ্যে কীভাবে ব্যবহার করবেন?

var customController = UICollectionViewController() //your custom class
var uikitController = UIKit.UICollectionViewController() //class from UIKit

কীভাবে তাদের অন্য মডিউল থেকে আলাদা করবেন?

var customController = MyApp.UICollectionViewController() //your custom class
var uikitController = UIKit.UICollectionViewController() //class from UIKit

3

ডান দিকে আপনার সমস্ত কোড ইনডেন্ট না করেই আপনি নাম স্পেসিংয়ের জন্য extensionউল্লিখিত structগুলি ব্যবহার করতে পারেন । আমি এটির সাথে কিছুটা চেষ্টা করেছি এবং আমি নিশ্চিত নই যে নীচের উদাহরণে যেমন তৈরি করা Controllersএবং Viewsনেমস্পেসগুলি রয়েছে ততটা যেতে পারব তবে এটি কতদূর যেতে পারে তা চিত্রিত করে:

প্রোফাইল.সুইফ্ট :

// Define the namespaces
struct Profiles {
  struct Views {}
  struct ViewControllers {}
}

প্রোফাইল / ViewControllers / Edit.swift

// Define your new class within its namespace
extension Profiles.ViewControllers {
  class Edit: UIViewController {}
}

// Extend your new class to avoid the extra whitespace on the left
extension Profiles.ViewControllers.Edit {
  override func viewDidLoad() {
    // Do some stuff
  }
}

প্রোফাইল / দেখেছে / Edit.swift

extension Profiles.Views {
  class Edit: UIView {}
}

extension Profiles.Views.Edit {
  override func drawRect(rect: CGRect) {
    // Do some stuff
  }
}

আমি এখনও কোনও অ্যাপ্লিকেশনটিতে এটি ব্যবহার করি নি যেহেতু আমার এখনও পর্যন্ত এই স্তরের বিচ্ছেদ প্রয়োজন হয়নি তবে আমি মনে করি এটি একটি আকর্ষণীয় ধারণা। এটি বিরক্তিকরভাবে দীর্ঘ যে সর্বব্যাপী * ভিউকন্ট্রোলার প্রত্যয় হিসাবে এমনকি শ্রেণীর প্রত্যয়গুলির প্রয়োজনীয়তা সরিয়ে দেয়।

যাইহোক, এটির মতো পদ্ধতি পরামিতিগুলিতে যেমন উল্লেখ করা হয় তখন এটি কিছুটা ছোট করে না:

class MyClass {
  func doSomethingWith(viewController: Profiles.ViewControllers.Edit) {
    // secret sauce
  }
}

2

যদি কেউ কৌতূহলী হয়ে থাকে তবে 10 ই জুন 2014 পর্যন্ত এটি সুইফটে একটি পরিচিত বাগ:

সেভেনটেনএলভেন থেকে

"জ্ঞাত বাগ, দুঃখিত! রডার: // সমস্যা / 17127940 তাদের মডিউলের নাম অনুসারে সুইফেল প্রকারের যোগ্যতা কার্যকর হয় না" "


নীচে @ ম্যাট এর পোস্টে, এটি এখনই সুইফ্টের একটি পরিচিত বাগ bu
অ্যাডাম ভেন্টুরেেলা

এটি এখন বিটা 3 এ স্থির করা হয়েছে (জুলাই 7 ই 2014 প্রকাশ করুন)
অ্যাডাম ভেন্টুরেেলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.