সুইট মেথডের প্যারামিটারকে মিউটটেবল করতে পারবেন?


123

অতিরিক্ত পরিবর্তনশীল তৈরি না করে আমি কীভাবে এই ত্রুটিটি মোকাবেলা করতে পারি?

func reduceToZero(x:Int) -> Int {
    while (x != 0) {
        x = x-1            // ERROR: cannot assign to 'let' value 'x'
    }
    return x
}

আমি এক্স এর মান সঞ্চয় করতে অতিরিক্ত পরিবর্তনশীল তৈরি করতে চাই না। আমি যা চাই তা করা কি সম্ভব?


3
নীচের আপডেট হওয়া উত্তরগুলি দেখুন, সুইফট 3 আপনার গৃহীত উত্তরকে অবমূল্যায়ন করেছে।
আচি

উত্তর:


191

অন্যান্য উত্তরে যেমন বলা হয়েছে, তত পরিবর্তনের আগে সুইফট 3 স্থাপনের ভেরি হিসাবে। অন্য উত্তরে বর্ণিত না হলেও inoutপ্যারামিটার ঘোষণা করার ক্ষমতা । চিন্তা করুন: একটি পয়েন্টার মধ্যে পাস।

func reduceToZero(_ x: inout Int) {
    while (x != 0) {
        x = x-1     
    }
}

var a = 3
reduceToZero(&a)
print(a) // will print '0'

এটি পুনরাবৃত্তিতে বিশেষভাবে কার্যকর হতে পারে।

অ্যাপলের inoutঘোষণাপত্রের গাইডলাইনগুলি এখানে পাওয়া যাবে


2
আপনাকে অনেক ধন্যবাদ!!!! আমি এখানে পুনরাবৃত্তি প্রশ্নে আটকে আছি। আপনি আমার জীবন বাঁচিয়েছেন।
JW.ZG

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

2
inoutকীওয়ার্ডটি প্যারামিটারের নাম এবং প্যারামিটার ধরণের মধ্যে থাকা উচিত: func reduceToZero(x: inout Int) বর্তমান সুইফট 3 সংস্করণে।
আগুস্তে সানচেজ

এটি ক্লোজারগুলির জন্য কাজ করবে বলে মনে হচ্ছে না কারণ ক্লোজারগুলি স্পষ্টতই মান দ্বারা আউটপুট প্যারামিটারগুলি ক্যাপচার করে (কমপক্ষে এটি এক্সকোড আমাকে প্রদত্ত ত্রুটি বার্তা)। আমি এই ক্ষেত্রে @ জিআরসিএইচ সমাধান ব্যবহার করি।
wcochran

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

45

'var' প্যারামিটারগুলি হ্রাস করা হয় এবং সুইফ্ট 3-এ সরানো হবে So সুতরাং নতুন প্যারামিটারে নিয়োগ দেওয়া এখন সেরা পন্থার মতো মনে হচ্ছে:

func reduceToZero(x:Int) -> Int {
    var x = x
    while (x != 0) {
        x = x-1            
    }
    return x
}

এখানে উল্লিখিত হিসাবে: 'var' প্যারামিটারগুলি হ্রাস করা হয়েছে এবং সুইফ্ট 3-এ সরানো হবে


1
এই ক্ষেত্রে, এটা আসলে কপি করে xনতুন var x? নাকি সুইফট এর চেয়ে আরও দক্ষ কিছু করছে?
গেঙ্কি

3
এটি কাজ করে এবং আমি যা করি তা কিন্তু এটি অত্যন্ত বিশ্রী বলে মনে হয়।
wcochran

1
সুইচ ৩.১ গাইডে @ গম্পফিউস এই সম্পর্কে একটি শব্দ নয় Not এই ক্ষেত্রে ( xনিবন্ধের সাথে ফিট করে) কার্যত কোনও মূল্য নেই। যদি xঅ্যারে, স্ট্রাক্ট বা বস্তুটি রূপান্তরিত হয় তবে একটি অনুলিপি অবশ্যই সম্পাদন করা দরকার (যদি না এটি অপ্টিমাইজার এটিকে ইনলাইনটি বিশ্লেষণ করতে না পারে এবং এটির নাম) না)
wcochran

1
@Wcochran এটি একটি ঝরঝরে কৌশল, তবে সত্যিই বিশেষ কিছু ঘটছে না। এটি কেবলমাত্র স্থানীয় বর্ণ অনুলিপি সহ একটি ইনপুট প্যারামিটারটি গ্রহ করছে। ওপি'র পরিস্থিতিতে এটি varব্যবহারের চেয়ে আরগসের চেয়ে ভাল প্রতিস্থাপন inoutযা অনিচ্ছাকৃত পার্শ্ব-প্রতিক্রিয়া থাকতে পারে, এসএসপি। যদি var একটি পয়েন্টার ছিল।
এচেলন

45

সুইফট 1 এবং 2 এর জন্য (সুইফ্ট 3 এর জন্য আচি আউটআউট প্যারামিটার ব্যবহার করে উত্তর দেখুন): সুইফটে কোনও ফাংশনের যুক্তিটি letডিফল্টরূপে হয় তাই আপনার varযদি মান পরিবর্তন করতে হয় তবে এটিতে পরিবর্তন করুন,

func reduceToZero(var x:Int) -> Int {
    while (x != 0) {
        x = x-1     
    }
    return x
}

2
এই উত্তরটি কেন নরকের মতো আপ-ভোট হয়েছে? অন্য উত্তরটি এই উত্তরটির আগে রাখা হয়েছিল এবং এতে উত্তরটির চেয়ে আরও বেশি তথ্য রয়েছে।
ক্রিশ্চিক

16
/! Var var ব্যবহার করে প্যারামিটারগুলিতে পাস করা ভেরিয়েবলের একটি অনুলিপি তৈরি হবে। সুতরাং এটি পরিবর্তন করে আসল মানটি পরিবর্তন করবে না। এছাড়াও varপ্যারামিটারগুলিতে github.com/apple/swift-evolution/blob/master/proposals/…
রিগলার

17
পদ্ধতি প্যারামিটারে কী কীওয়ার্ডটি সুইফট 3-এ অবহিত করা হবে
বুন

4
আমি মনে করি সুইফট 3 দিয়ে আমরা আর এটি করতে পারব না। আমাদের অ্যারেটির একটি ভেরিয়েবল কপি তৈরি করতে হবে এবং সেই সংশোধিত অ্যারেটি ফিরিয়ে আনতে হবে।
C0D3

এই উত্তরটি সঠিক উত্তর: stackoverflow.com/questions/24077880/…
আচি

14

পরিবর্তনীয় অ্যারে পয়েন্টারটি পাস করার জন্য সুইফট 3 উত্তর।

ফাংশন:

func foo(array: inout Array<Int>) {
    array.append(1)
}

ফাংশন কল:

var a = Array<Int>()
foo(array:&a)

সত্যি বলতে, আমি নিশ্চিত নই যে সুইফট গ্রাউন্ডটি সর্বদা পরিবর্তিত হওয়ায় এটি সঠিক কিনা। আমি ফাংশনের ভিতরে var অ্যারে = অ্যারে করার চেয়ে এটি আরও ভাল মনে করেছি কারণ এটি একটি অনুলিপি তৈরি করে (এবং আসলে মূল অ্যারে কাঠামোকে প্রভাবিত করে না)? পূর্বোক্ত বর্ণের পদ্ধতির জন্য কি আরও ভাল ডিজাইনের পদ্ধতি এবং তারপরে নতুন রূপান্তরিত অ্যারেটি ফেরত দেওয়া হয়?
31:56

7

স্যুইফ্টে আপনি কেবল varক্রিয়াকলাপের ঘোষণায় ভেরিয়েবল নামের আগে কীওয়ার্ডটি যুক্ত করুন :

func reduceToZero(var x:Int) -> Int { // notice the "var" keyword
    while (x != 0) {
        x = x-1            
    }
    return x
}

সুইফট বইয়ের "ফাংশন" অধ্যায়ের "কনস্ট্যান্ট এবং ভেরিয়েবল প্যারামিটারগুলি" উপবিধানটি পড়ুন (আইবুকের 210 পৃষ্ঠাটি আজ যেমন রয়েছে)।


7
'var' প্যারামিটারগুলি
অবচয়

1
সুইফট 4 এবং আরও নতুনর জন্য বৈধ নয়।
ilkayaktas

0

এমন কিছু কেস রয়েছে যেখানে আমরা ব্যবহারের দরকার নেই inout

আপনি যদি পরিবর্তন / সুযোগ কেবলমাত্র ফাংশনের অভ্যন্তরে থাকতে চান তবে আমরা এর মতো কিছু ব্যবহার করতে পারি:

func manipulateData(a: Int) -> Int {
    var a = a
    // ...
}

0

ক্রিয়ামূলক প্রোগ্রামিং সহ সুইফট 5 ব্যবহার করে সমাধান ...

func reduceToZeroFP(x:Int) -> Int {
    x == 0 ? x : reduceToZeroFP(x: x - 1)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.