স্যুইফট রূপান্তর করুন পরিসর <আইটেম> [ইনট] তে রূপান্তর করুন


107

কিভাবে রেঞ্জকে অ্যারেতে রূপান্তর করা যায়

আমি চেষ্টা করেছিলাম:

let min = 50
let max = 100
let intArray:[Int] = (min...max)

ত্রুটি পেতে Range<Int> is not convertible to [Int]

আমি চেষ্টাও করেছি:

let intArray:[Int] = [min...max]

এবং

let intArray:[Int] = (min...max) as [Int] 

তারা কোন কাজ করে না।

উত্তর:


204

আপনাকে করার প্রয়োজন সৃষ্টি একটি Array<Int>ব্যবহার Range<Int>বদলে ঢালাই এটা ing।

let intArray: [Int] = Array(min...max)

1
ধন্যবাদ, আপনি আপনার উত্তরটি পাঠানোর সময় আমি এটি ঠিক
পেয়েছি

পরিসীমাটি বড় হলে এটি ক্র্যাশ হয়ে গেছে বলে মনে হচ্ছে: মানগুলি অ্যারে: [Int64] = অ্যারে (1 ... 4294967292) - সম্ভবত কারণ এটি কেবল ইনট 64 পরিচালনা করতে পারে এবং ইন্টার 64 না?
ড্যানিয়েল স্প্রিংগার

2
@ ড্যানিয়েলস্প্রিঞ্জার: এটি অ্যারের মান নয়, যা সমস্যার কারণ হয়ে থাকে, তবে ভাষা নির্দিষ্টকরণের সূচি নির্ধারিত সীমা অতিক্রম করে। এই বিশাল অ্যারে ধরে রাখার জন্য দয়া করে আপনার কতটা র্যাম দরকার তা গণনা করুন।
ব্যবহারকারী অজানা

@ ব্যবহারকারীর জানা তাই কি মানের ধরণ নয়, তবে মানগুলির পরিমাণ? গ্যাচ্চা, ধন্যবাদ!
ড্যানিয়েল স্প্রিংগার

1
@ ড্যানিয়েল স্প্রিংগার, এটি এমন একটি শব্দের মত শোনাচ্ছে যেখানে আপনার অবশ্যই র্যান্ডম জেনারেটর ব্যবহার করা উচিত, কিছু বিকল্পের জন্য এখানে দেখুন: হ্যাকিংউইথসইভিট
ক্লাউস


14

আমি এটি বের করেছিলাম:

let intArray = [Int](min...max)

অন্য কাউকে creditণ দেওয়া হচ্ছে।


13

একটি করুন:

let intArray = Array(min...max)

এটি কাজ করা উচিত কারণ Arrayএকটি ইনিশিয়ালাইজারটি গ্রহণ করে SequenceTypeএবং Rangeমানায় SequenceType


10

ব্যবহার map

let min = 50
let max = 100
let intArray = (min...max).map{$0}

এটি কেন কাজ করে তা যুক্ত করা এই ধরণের প্রশ্নগুলি পড়ছেন তাদের পক্ষে উপকারী হবে। উদাহরণস্বরূপ উল্লেখ করে যে এটি একটি CoutableClosedRange তৈরি করে যা সিকোয়েন্স প্রোটোকল প্রয়োগ করে, তাই মানচিত্রটি সম্ভব এবং মানচিত্রের ক্রিয়াকলাপ সম্পাদন করার সময় এটি একটি নতুন আন্তঃজাত লাভ করে। কিছু পটভূমি জ্ঞান সর্বদা ভাল
denis631

অন্যান্য উত্তরগুলি আকর্ষণীয় তবে এটি আসলে প্রশ্নের উত্তর দেয়। বড় আপ।
ড্যান রোজনস্টার্ক

3

আকর্ষণীয় যে আপনি (কমপক্ষে, সুইফট 3 এবং এক্সকোড 8 সহ) Range<Int>সরাসরি অবজেক্টটি ব্যবহার করতে পারবেন না :

let range: Range<Int> = 1...10
let array: [Int] = Array(range)  // Error: "doesn't conform to expected type 'Sequence'"

অতএব, যেমনটি আগে উল্লেখ করা হয়েছিল, আপনার নিজের মতো পরিসরে ম্যানুয়ালি "আনআরপ" করা দরকার:

let array: [Int] = Array(range.lowerBound...range.upperBound)

অর্থাত্, আপনি কেবল আক্ষরিক ব্যবহার করতে পারেন।


এর কারণ হ'ল রেঞ্জগুলি সংগ্রহ নয়। ব্যাপ্তি এবং গণনাযোগ্য ব্যাপ্তির মধ্যে পার্থক্য হ'ল পরেরটিটি একটি পূর্ণসংখ্য মানের দ্বারা পুনরাবৃত্তি হতে পারে। সেই কারণে কাউন্টেবল রেঞ্জটি একটি সংগ্রহের ধরণ যা দ্রুতগতির তবে পরিসরটি নয়।
কোরি জাম্বনি

এটা ঠিক, এবং আমি এটি আশা করছিলাম না, অর্থাত্ দুটি ভিন্ন ভিন্ন পরিসরের ক্লাস। সম্ভবত পাইথোনিক ব্যাখ্যার কারণে range()
devforfu

1

সুইফ্ট 3 / এক্সকোড 8 যেহেতু এক CountableRangeধরণের রয়েছে যা কার্যকর হতে পারে:

let range: CountableRange<Int> = -10..<10
let array = Array(range)
print(array)
// prints: 
// [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

এটি সরাসরি for- inলুপগুলিতে ব্যবহার করা যেতে পারে :

for i in range {
    print(i)
}

এটি (এখন) কার্য পরিচালনা করার সঠিক উপায়। এছাড়াও সুইফট 4-এ কাজ করে
অ্যাশ

0

আপনি এই জাতীয় ফাংশনগুলিতে হ্রাস () এর সাথে ক্লোসড্রেঞ্জ এবং রেঞ্জের অন্তর অন্তরগুলি প্রয়োগ করতে পারেন।

func sumClosedRange(_ n: ClosedRange<Int>) -> Int {
    return n.reduce(0, +)
}
sumClosedRange(1...10) // 55


func sumRange(_ n: Range<Int>) -> Int {
    return n.reduce(0, +)
}
sumRange(1..<11) // 55
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.