ডকুমেন্টেশনে কেবল নেস্টেড ধরণের উল্লেখ রয়েছে তবে সেগুলি স্পেস হিসাবে স্পষ্ট নয় যে তারা নামস্থান হিসাবে ব্যবহার করতে পারে। নেমস্পেসের কোনও সুস্পষ্ট উল্লেখ আমি পাইনি।
ডকুমেন্টেশনে কেবল নেস্টেড ধরণের উল্লেখ রয়েছে তবে সেগুলি স্পেস হিসাবে স্পষ্ট নয় যে তারা নামস্থান হিসাবে ব্যবহার করতে পারে। নেমস্পেসের কোনও সুস্পষ্ট উল্লেখ আমি পাইনি।
উত্তর:
উত্তর SevenTenEleven মধ্যে অ্যাপল দেব ফোরাম :
নেমস্পেসগুলি প্রতি ফাইল হিসাবে নয়; তারা প্রতি লক্ষ্য ("পণ্য মডিউল নাম" বিল্ড সেটিংস উপর ভিত্তি করে) হয়। সুতরাং আপনি এই জাতীয় কিছু দিয়ে শেষ করতে চাই:
import FrameworkA import FrameworkB FrameworkA.foo()
সমস্ত সুইফ্ট ঘোষণাকে কিছু মডিউলের অংশ হিসাবে বিবেচনা করা হয়, সুতরাং আপনি "
NSLog
" বলার পরেও (হ্যাঁ, এটি এখনও বিদ্যমান) আপনি সুইফটকে "Foundation.NSLog
" হিসাবে যা ভাবেন তাই পেয়ে যাচ্ছেন ।
এছাড়াও ক্রিস ল্যাটনার নেমস্পেসিংয়ের বিষয়ে টুইট করেছেন ।
নেমস্পেসিং সুইফটে অন্তর্নিহিত, সমস্ত ক্লাস (ইত্যাদি) মডিউল (এক্সকোড লক্ষ্য) এর মধ্যে রয়েছে সেগুলি স্পষ্টভাবে স্কোপ করা হয় no কোনও শ্রেণির উপসর্গের প্রয়োজন নেই
আমি যা ভাবছিলাম তা খুব আলাদা বলে মনে হচ্ছে।
forums.developer.apple.com
দুর্ভাগ্যক্রমে, অ্যাপল দেব ফোরামগুলির লিঙ্কটি এখন ভেঙে গেছে এবং অ্যাপল সেই থ্রেডটি নতুন ফোরাম সাইটে আমদানি করতে পারেনি ।
আমি সুইফ্টের নেমস্পেসিকে উচ্চাকাঙ্ক্ষী হিসাবে বর্ণনা করব; এটিকে প্রচুর বিজ্ঞাপন দেওয়া হয়েছে যা মাটির কোনও অর্থবহ বাস্তবতার সাথে মিল নয়।
উদাহরণস্বরূপ, ডাব্লুডাব্লুডিসি ভিডিওতে বলা আছে যে আপনি যে ফ্রেমওয়ার্কটি আমদানি করছেন তাতে যদি ক্লাস মাইক্লাস থাকে এবং আপনার কোডটিতে একটি ক্লাস মাইক্লাস থাকে তবে সেই নামগুলি বিরোধী হয় না কারণ "নাম মাঙ্গলিং" তাদের বিভিন্ন অভ্যন্তরীণ নাম দেয়। প্রকৃতপক্ষে, যাইহোক, তারা কি দ্বন্দ্ব অর্থে, যে আপনার নিজের কোডের MyClass জয়ী, এবং আপনি নির্দিষ্ট করতে পারেন না "না না, আমি কাঠামোর মধ্যে MyClass মানে" - এই বলে TheFramework.MyClass
কাজ নেই (কম্পাইলার জানেন তোমরা কি মানে , তবে এটি বলে যে এটি ফ্রেমওয়ার্কে এ জাতীয় শ্রেণি খুঁজে পাচ্ছে না)।
আমার অভিজ্ঞতা হ'ল সুইফট অতএব সামান্যতম ক্ষেত্রেও নামগতির নয়। আমার কোন অ্যাপ্লিকেশনটিকে ওজেক্টিভ-সি থেকে সুইফ্টে পরিণত করার সময়, আমি একটি এম্বেডযুক্ত কাঠামো তৈরি করেছি কারণ এটি করা খুব সহজ এবং দুর্দান্ত ছিল। ফ্রেমওয়ার্কটি আমদানি করা যাইহোক, ফ্রেমওয়ার্কে সমস্ত সুইফ্ট স্টাফ আমদানি করে - সুতরাং পূর্ববর্তী, আবার একবার মাত্র একটি নাম স্থান আছে এবং এটি বিশ্বব্যাপী। এবং কোনও সুইফ্ট শিরোনাম নেই তাই আপনি কোনও নাম গোপন করতে পারবেন না।
সম্পাদনা: বীজ 3 তে, এই বৈশিষ্ট্যটি এখন নিম্নোক্ত অর্থে অনলাইনে আসতে শুরু করেছে: যদি আপনার মূল কোডটিতে মাই ক্লাস থাকে এবং আপনার ফ্রেমওয়ার্কটি মাইফ্রেমে ওয়ার্কে মাইক্লাস থাকে তবে প্রাক্তনটি পূর্ববর্তী ডিফল্টটিকে ছাপিয়ে দেয় তবে আপনি ফ্রেমওয়ার্কের মধ্যে একটিতে পৌঁছতে পারেন সিনট্যাক্স ব্যবহার করে MyFramework.MyClass
। সুতরাং আমরা আসলে একটি স্বতন্ত্র নাম স্থানের rudimements আছে!
সম্পাদনা 2: 4 বীজে, এখন আমাদের অ্যাক্সেস নিয়ন্ত্রণ রয়েছে! এছাড়াও, আমার অ্যাপ্লিকেশনগুলির একটিতে আমার একটি এম্বেডড ফ্রেমওয়ার্ক রয়েছে এবং এটি যথেষ্ট নিশ্চিত, সমস্ত কিছু ডিফল্টরূপে লুকানো ছিল এবং আমাকে পাবলিক এপিআইয়ের সমস্ত বিট স্পষ্টভাবে প্রকাশ করতে হয়েছিল। এটি একটি বড় উন্নতি।
Foundation.NSArray
।
এটি নিয়ে কিছু পরীক্ষা-নিরীক্ষার সময় আমি রুট "প্যাকেজ" প্রসারিত করে তাদের নিজস্ব ফাইলগুলিতে এই "নেমস্পিড" ক্লাসগুলি তৈরি করে শেষ করেছি। নিশ্চিত না যে এটি সর্বোত্তম অনুশীলনের বিরুদ্ধে কিনা বা এর যদি এর কোনও প্রভাব থাকে তবে আমি সচেতন (?)
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
আমি বিশ্বাস করি এটি ব্যবহার করে এটি অর্জন করা হয়েছে:
struct Foo
{
class Bar
{
}
}
তারপরে এটি ব্যবহার করে অ্যাক্সেস করা যায়:
var dds = Foo.Bar();
enum
, ক না struct
, তাই আপনি এটিকে ইনস্ট্যান্ট করতে পারবেন না Foo
।
সুইফট অজগরগুলির মতো অনেকগুলি মডিউল ব্যবহার করে ( এখানে এবং এখানে দেখুন ) এবং @ কেভিন সিলভেস্টারের পরামর্শ অনুসারে আপনি নেস্টেড প্রকারগুলি নেমস্পেস হিসাবেও ব্যবহার করতে পারেন ।
এবং উত্তর ড্যানিয়েল এ হোয়াইট এর উত্তর বাড়ানোর জন্য, ডাব্লুডাব্লুডিসিতে তারা দ্রুত মডিউলগুলি নিয়ে কথা বলছিলেন।
এছাড়াও এখানে ব্যাখ্যা করা হয়:
অনুমিত প্রকারগুলি কোড ক্লিনার এবং ভুলগুলির জন্য কম প্রবণ করে তোলে, যখন মডিউলগুলি শিরোনামগুলি সরিয়ে দেয় এবং নেমস্পেস সরবরাহ করে।
যখন আপনাকে বিদ্যমান ফ্রেমওয়ার্কে ক্লাস হিসাবে একই নামের সাথে বর্গ নির্ধারণ করতে হবে তখন নেমস্পেসগুলি দরকারী ।
মনে করুন আপনার অ্যাপটির
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
ডান দিকে আপনার সমস্ত কোড ইনডেন্ট না করেই আপনি নাম স্পেসিংয়ের জন্য 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
}
}
যদি কেউ কৌতূহলী হয়ে থাকে তবে 10 ই জুন 2014 পর্যন্ত এটি সুইফটে একটি পরিচিত বাগ:
সেভেনটেনএলভেন থেকে
"জ্ঞাত বাগ, দুঃখিত! রডার: // সমস্যা / 17127940 তাদের মডিউলের নাম অনুসারে সুইফেল প্রকারের যোগ্যতা কার্যকর হয় না" "