সুইফটে একটি স্লাইস কি?


85

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

ডকুমেন্টেশন থেকে সাবস্ক্রিপ্ট (রেঞ্জ) এর স্বাক্ষরটি হ'ল:

subscript(Range<Int>) -> Slice<T>

এটার Array<T>বদলে আর কেন ফিরবে না Slice<T>?

দেখে মনে হচ্ছে আমি একটি অ্যারের সাথে একটি স্লাইস যোগ করতে পারি:

var list = ["hello", "world"]
var slice: Array<String> = [] + list[0..list.count]

তবে এতে ত্রুটি পাওয়া যায়:

সরবরাহকৃত আর্গুমেন্টগুলি গ্রহণ করে এমন 'সাবস্ক্রিপ্ট' এর জন্য কোনও ওভারলোড সন্ধান করতে পারেনি

var list = ["hello", "world"]
var slice: Array<String> = list[0..list.count]

স্লাইস কি?

উত্তর:


97

স্লাইস অ্যারেতে নির্দেশ করে। অ্যারে ইতিমধ্যে উপস্থিত থাকলে স্লাইস এটির কাঙ্ক্ষিত অংশটি বর্ণনা করতে পারে তখন আর অ্যারে তৈরি করার কোনও বিষয় নেই।

সংযোজন অন্তর্নিহিত জবরদস্তির কারণ, তাই এটি কাজ করে। আপনার অ্যাসাইনমেন্টটি কাজ করার জন্য, আপনাকে বাধ্য করা দরকার:

var list = ["hello", "world"]
var slice: Array<String> = Array(list[0..<list.count])

এটা বোধগম্য. এটি ডকুমেন্টেশনের কোথাও বর্ণনা করা হয়েছে?
hjing

4
এটি বাস্তবায়নের বিশদ, সত্যই। আপনি চালাকি করে প্রান্তের কেসটি পরীক্ষা করেছেন যা ব্ল্যাক বক্সের কাজগুলি প্রকাশ করে ...!
ম্যাট

4
আসলে স্লাইস অ্যারের অনুলিপি। আপনি মূল অ্যারে আপডেট করার পরে, টুকরো টুকরো বদলে যাবে না। এটি কাঠামো প্রকৃতির কারণে। এবং দ্রষ্টব্যটির জন্য, স্লাইজেবল প্রোটোকল স্লাইস ধরণের ব্যবহার বোঝায় না
মার্সিন

4
দ্রুতগতি ভাষা পরিবর্তিত হয়েছে এবং একটি ফালি আসলে তিন ঊহ্য শব্দ ব্যবহার এবং দুই developer.apple.com/library/ios/documentation/General/Reference/...
ড্যানিয়েল Galasko

7
আপনি যদি নতুন পাঠককে জানাতে একটি সাধারণ সম্পাদনা যুক্ত করেন যে রেঞ্জ অপারেটরগুলি পরিবর্তন হয়েছে?
ড্যানিয়েল গালাসকো

22

দ্রষ্টব্য: এই উত্তরটি স্যুইফ্ট বিটা 3 হিসাবে সুখীভাবে অবৈধ, যেহেতু অ্যারেগুলি এখন সত্য মানের ধরণ।


@ ম্যাটটি সঠিক, উপরে - Slice<T>অ্যারেতে পয়েন্টগুলি। এটি আমরা যে অন্যান্য ডেটা ধরণের সাথে কাজ করছি তা হ্যান্ডেল যেভাবে পরিচালনা করে তার বিপরীত বলে মনে হয়, কারণ এর অর্থ স্লাইসের মান স্থির হিসাবে ঘোষণা করা সত্ত্বেও পরিবর্তিত হতে পারে:

var arr = ["hello", "world", "goodbye"]    // ["hello", "world", "goodbye"]
let slice = arr[0..2]                      // ["hello", "world"]
arr[0] = "bonjour"
println(slice)                             // ["bonjour", "world"]

সবচেয়ে খারাপ দিকটি হ'ল স্লাইস ঠিক অ্যারের মতোই কাজ করে। সুইফটে আমরা অপরিবর্তনীয়তার একটি প্রত্যাশা রেখেছিলে এটি বিপজ্জনক বলে মনে হয় যে স্লাইসের সাবস্ক্রিপ্ট করা মানগুলি সতর্কতা ছাড়াই পরিবর্তিত হতে পারে:

println(slice[1])                          // "world"
arr[1] = "le monde"
println(slice[1])                          // "le monde"

তবে যদি অন্তর্নিহিত অ্যারেগুলি খুব মারাত্মকভাবে পরিবর্তিত হয়, তবে তারা অদৃশ্য হয়ে যায়:

arr.removeAtIndex(0)                       // this detaches slice from arr
println(slice)                             // ["bonjour", "le monde"]
arr[0] = "hola"
println(slice)                             // ["bonjour", "le monde"]

6
প্রকৃতপক্ষে, টুকরাগুলি ঠিক অ্যারেগুলির মতোই কাজ করে, যেমনটি আপনি বলেছেন। সুইফ্ট অ্যারেগুলিতে পারস্পরিক পরিবর্তনযোগ্য উপাদান রয়েছে, তাদের এগুলি অযোগ্য হিসাবে ঘোষণা করা হলেও । উদাহরণস্বরূপ, চেষ্টা করুন let arr = ["hello", "world", "goodbye"]; arr[0] = "bonjour"। আপনি এটি কাজ করবে। অদ্ভুতরূপে, পরিবর্তনযোগ্য অ্যারে সহ, এটি কেবলমাত্র আকারের যা অপরিবর্তনীয়, সামগ্রী নয়। ( দ্য সুইফ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজে "সংগ্রহের পরিবর্তনের" দেখুন )
ম্যাট গিবসন

4
"পরিবর্তনীয় উপাদানগুলি" - এটি আর সত্য নয়
অ্যালেক্স ব্রাউন

14

সারসংক্ষেপ:

বিটা 3 অবধি উপরের উত্তরগুলি সত্য ছিল (এবং ভবিষ্যতে প্রকাশে আবার পরিবর্তন হতে পারে)

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

আরও মনে রাখবেন যে স্লাইস সিনট্যাক্স পরিবর্তিত হয়েছে:

[from..upToButNotIncluding] -> [from..<upToButNotIncluding]

উদাহরণ:

var arr = ["hello", "world", "goodbye"] // ["hello", "world", "goodbye"]
var arrCopy = arr
let slice = arr[0..<2]                  // ["hello", "world"]
arr[0] = "bonjour"
arr                                     // ["bonjour", "world", "goodbye"]
arrCopy                                 // ["hello", "world", "goodbye"]
slice                                   // ["hello", "world"]

এটি আরও অনেক অভিন্ন প্রক্রিয়াজাতকরণকে মঞ্জুরি দেয়, কারণ পাইথন স্টাইলের তালিকা প্রক্রিয়াকরণ করা সহজ (আইএমএইচও) - একটি তালিকা তৈরি করতে অন্য তালিকা তৈরি করে। বিটা 3 এর আগে ম্যাট এর উত্তর অনুসারে, একটি স্লাইস মানচিত্র করার জন্য আপনাকে একটি অস্থায়ী অ্যারে তৈরি করতে হবে। নতুন কোডটি এখন সহজ:

class NameNumber {
    var name:String = ""
    var number:Int = 0

    init (name:String, number:Int) {
        self.name = name
        self.number = number
    }
}

var number = 1
let names = ["Alan", "Bob", "Cory", "David"]
let foo = names[0..<2].map { n in NameNumber(name:n, number:number++) }
foo     // [{name "Alan" number 1}, {name "Bob" number 2}]

(যদিও ন্যায্য, foo এখনও একটি টুকরা)

তথ্যসূত্র:

http://adcdownload.apple.com//Developer_Tools/xcode_6_beta_3_lpw27r/xcode_6_beta_3_release_notes__.pdf

গুরুত্বপূর্ণ পরিবর্তনসমূহ, সমস্যাগুলি সমাধান হয়েছে - সুইফট ল্যাঙ্গুয়েজ, অনুচ্ছেদ 1

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

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