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


120

ঠিক আছে তাই আমি মাত্র Xcode 7.3 এ আপডেট করেছি এবং এখন আমি এই সতর্কতাটি পেয়েছি:

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

যখন এই ফাংশনে আমার ভ্যার ব্যবহার করতে হবে তখন কীভাবে এটি ঠিক করবেন:

public func getQuestionList(var language: String) -> NSArray {
    if self.data.count > 0 {
        if (language.isEmpty) {
            language = "NL"
        }
        return self.data.objectForKey("questionList" + language) as! NSArray
    }

    return NSArray()
}

6
কীভাবেpublic func getQuestionList(inout language: String) -> NSArray
টোটোরটোটো

2
না, এটি কোনও উপযুক্ত প্রতিস্থাপন নয়। ওপি সম্ভবত getQuestionকোনও পার্শ্ব প্রতিক্রিয়া থাকতে চায় না ।
বলপয়েন্টবেন

5
তারা কেন এটিকে অপসারণের বিষয়টি বিবেচনা করবে তা আমার সত্যিই ধারণা নেই। এটি এমন একটি বৈশিষ্ট্য যা দ্রুতগতিতে দুর্দান্ত করে তুলেছিল!
ড্যানি ব্র্যাভো

এটি নিজেই কখনও ব্যবহার করি না এবং কোলাহল বুঝতে পারি না।
মাইক টাভের্নে 1'16

@MikeTaverne (দেরী উত্তর) বিবেচনা করুন নিম্নলিখিত ফাংশন: func foo(_ bar: int) { /*use bar*/ bar+=1; foo(bar); }। ভার প্যারাম ছাড়াই এটি অসম্ভব। হয় আপনি ফাংশন মধ্যে একটি পৃথক var তৈরি করতে হবে এবং মান অনুলিপি, বা পরম ইনআউট হিসাবে চিহ্নিত করুন। পূর্বেরটি ধীরে ধীরে, পরবর্তীগুলি অনির্ধারিত আচরণের কারণ হয়। অনেক অ্যালগরিদম এ জাতীয় পুনরাবৃত্তি ব্যবহার করে।
কেভিন

উত্তর:


82

আপনি কি নতুন ভারতে বরাদ্দ দেওয়ার চেষ্টা করেছেন?

public func getQuestionList(language: String) -> NSArray {
    var lang = language
    if self.data.count > 0 {
        if (lang.isEmpty) {
            lang = "NL"
        }
        return self.data.objectForKey("questionList" + lang) as! NSArray
    }

    return NSArray()
}

11
ওপি যা চেয়েছিল তা সত্যই নয়
গন্ধক পাথর

6
আমি ওপি এর প্রশ্নটিকে @ গ্রানা হিসাবে একইভাবে বুঝতে পারতাম। ওপি তাদের প্রশ্নের ক্ষেত্রে ইনআউট ব্যবহার করে না, তারা কেবল স্থানীয়ভাবে একটি বিদ্যমান বিদ্যমান ভেরিয়েবলকে পরিবর্তন করে ।
এরিক আয়া

11
আসলে এটিই সঠিক সমাধান। দয়া করে সুইফট বিবর্তন ইস্যুটি দেখুন যা এই পরিবর্তনের প্রস্তাব দিয়েছে: github.com/apple/swift-evolution/blob/master/proposals/…
স্কট থম্পসন

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

25
ভেরি ভাষা = ভাষা ব্যবহার করুন, আপনি যদি অন্য কোনও চলক নামটি প্রবর্তন করতে না চান (যা ইমোতে প্রথম স্থানের প্যারামিটারের প্রধান সুবিধা ছিল)
হ্যারিস

102

ফাংশন প্যারামিটার থেকে ভার অপসারণের আলোচনাটি গিটহাবের এই জমা দেওয়ার মধ্যে পুরোপুরি নথিবদ্ধ করা হয়েছে: ভার প্যারামিটারগুলি সরান

সেই দস্তাবেজে আপনি দেখতে পাবেন যে লোকেরা প্রায়শই varপরামিতিগুলির সাথে inoutপরামিতিগুলিকে বিভ্রান্ত করে । একটি varপ্যারামিটারটির সহজ অর্থ হ'ল প্যারামিটারটি ফাংশনের প্রেক্ষাপটে পরিবর্তিত inoutহয়, তবে প্যারামিটারের সাথে ফেরতের সময় প্যারামিটারের মানটি ফাংশনটির বাইরে এবং কলারের প্রসঙ্গে অনুলিপি করা হয়।

এই সমস্যাটি সমাধানের সঠিক উপায় হ'ল varপ্যারামিটার থেকে সরিয়ে একটি স্থানীয় varভেরিয়েবল প্রবর্তন করা । রুটিনের শীর্ষে প্যারামিটারের মানটি সেই পরিবর্তনশীলতে অনুলিপি করুন।


44
আমি এই পরিবর্তনটি মোটেও বুঝতে পারি না, কেন পরস্পর পরিবর্তিত স্থানীয় ভার তৈরির জন্য অন্য লাইনটি লিখতে হবে, কেবল পরমকে ভেরি হিসাবে সংজ্ঞায়িত করার চেয়ে ভাল?
রস বার্বিশ

আমার জন্য এই পরিবর্তনটি ভাল কারণ এটি এমন পরিস্থিতি বাছাই করছে যেখানে আমার স্থানীয় ভেরিয়েবল কার্যকর করা উচিত ছিল তবে আমি সহজ উপায় গ্রহণ করে গ্রহণ করি নি (পুরানো) ইনপুট প্যারামিটারটিকে
ভেরি বানানোর

1
আমি এই বিষয়ে @ রোসবার্বিশের সাথে আছি। সুতরাং ... এটি সরানো হচ্ছে কারণ অলস বিকাশকারীরা ইনআউট এবং ভার প্যারামিটারের মধ্যে পার্থক্য করতে পারে না? পিএফএফ ...
ড্যানি ব্র্যাভো

1
এটি অত্যন্ত অপ্রয়োজনীয় মনে হচ্ছে ..., তাদের উভয় বিকল্প রাখা উচিত ছিল।
অস্কার গোমেজ

1
সম্ভবত সুইফট যাইহোক পর্দার পিছনে প্যারামিটারের স্থানীয় ভেরিয়েবল ওভারটোপ ঘোষণা করে। এখন আমাদের এটি ম্যানুয়ালি করতে হবে। পারফরম্যান্সে কোনও পরিবর্তন হয়নি, তবে আমরা একটি সহজ ধারণা দিয়ে নতুনদের সহায়তা করার সুবিধাকে হারিয়েছি।
mogelbuster

62

ফাংশনের শুরুতে এই একটি লাইন যুক্ত করুন:

var language = language

এবং আপনার বাকী কোডটি অপরিবর্তিত থাকতে পারে, এর মতো:

public func getQuestionList(language: String) -> NSArray {
    var language = language
    if self.data.count > 0 {
        if (language.isEmpty) {
            language = "NL"
        }
        return self.data.objectForKey("questionList" + language) as! NSArray
    }

    return NSArray()
}

5
এখন পর্যন্ত সেরা উত্তর। শুধুমাত্র একটি লাইন পরিবর্তন করতে হবে।
বলপয়েন্টবেন 3

তবে জেমসকে তাই অপ্রাকৃত দেখায়
অ্যাসিঙ্কয়েট

1
আমি মনে করি এটি সেরা নাম হিসাবে এটি একই নাম রাখে। অন্যান্য সাধারণ ভাষাগুলি কীভাবে এটি করে তার মতো।
23:51 এ 21 এপ্রিলটিকে ইওনিস্ট

1
@ রিভারসাত্যা কেন সরাসরি প্যারামিটারটি ব্যবহার করবেন না?
ডিক্লান ম্যাককেনা

1
সত্যিই একটি দুর্দান্ত পরামর্শ। আমরা এটি সুইফটিফাইতে এভাবে বাস্তবায়ন করব :)
ক্রুলেক্স

13

প্রচুর লোক একটি inoutপ্যারামিটারের পরামর্শ দিচ্ছেন , তবে তারা যা ডিজাইন করেছেন তা আসলে এটি নয়। তদ্ব্যতীত, এটি কোনও letধ্রুবক বা স্ট্রিং আক্ষরিক সহ ফাংশনটি কল করার অনুমতি দেয় না । আপনি কেবল ফাংশনের স্বাক্ষরে ডিফল্ট মানটি যুক্ত করবেন না কেন?

public func getQuestionList(language language: String = "NL") -> NSArray {
    if data.count > 0 {
        return data.objectForKey("questionList" + language) as! NSArray
    } else {
        return NSArray()
    }
}

getQuestionListআপনি যদি ডিফল্ট ভাষা চান তবে খালি স্ট্রিং দিয়ে কল না করার বিষয়টি নিশ্চিত করুন , তবে কেবলমাত্র প্যারামিটারটি রেখে দিন:

let list = getQuestionList() // uses the default "NL" language

3
আমিও বুঝতে পারি না যে যখন ওপি শুরুতে এটি ব্যবহার করছিল না তখন কেন সকলেই ইনআউট সমাধানে ঝাঁপিয়ে পড়েছিল ...
এরিক আয়া

1
তারা ধরে নিয়েছিল যে ভের এবং আউট আউট একই কাজ করেছে।
ryantxr

2

সুইফট 4

public func getQuestionList(language: inout String) -> NSArray {
    if self.data.count > 0 {
        if (language.isEmpty) {
            language = "NL"
        }
        return self.data.objectForKey("questionList" + language) as! NSArray
    }

    return NSArray()
}

getQuestionList(language: &someString)

কিছু ক্ষেত্রে, যেমনটি আমি অভিজ্ঞ হয়েছি (আরও জটিল সেটআপের সাথে অ্যারে জড়িত রয়েছে), পদ্ধতির মধ্যে একটি নতুন সম্পত্তি তৈরি করা এবং সেই সম্পত্তিটি পরিবর্তন করা যাতে সর্বদা কাজ না করে। উল্লেখ করার মতো নয়, আপনি inoutকোনও প্যারামিটার এবং &তার যুক্তিতে কেবল যুক্ত করার পরিবর্তে পদ্ধতিটি বিশৃঙ্খলা করছেন যা এই বাক্য গঠনটি তৈরি হয়েছিল।



0

আমি মনে করি @ হারিস এবং @ গারান্ডা উত্তরগুলি সর্বোত্তম পন্থা।

যাইহোক আপনার ক্ষেত্রে, কোনও বর্ণের প্রয়োজন নেই, আপনি এটি করতে পারেন:

public func getQuestionList(language: String) -> NSArray {
    if self.data.count > 0 {
        return self.data.objectForKey("questionList" + (language.isEmpty ? "NL" : language)) as! NSArray
    }
    return NSArray()
}

0

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

ইন-আউট প্যারামিটার

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

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

আপনি কেবল ইন-আউট প্যারামিটারের আর্গুমেন্ট হিসাবে একটি ভেরিয়েবল পাস করতে পারেন। আপনি আর্গুমেন্ট হিসাবে ধ্রুবক বা আক্ষরিক মান পাস করতে পারবেন না, কারণ ধ্রুবক এবং আক্ষরিক পরিবর্তন করা যায় না। আপনি যখন কোনও ইন-আউট প্যারামিটারের আর্গুমেন্ট হিসাবে এটি পাস করেন তখন আপনি কোনও এম্পারস্যান্ড (&) সরাসরি কোনও ভেরিয়েবলের নামের আগে স্থাপন করেন, যাতে এটি ফাংশনটির মাধ্যমে সংশোধন করা যায় indicate

বিঃদ্রঃ

ইন-আউট প্যারামিটারগুলির ডিফল্ট মান থাকতে পারে না এবং বৈকল্পিক পরামিতিগুলিকে ইনআউট হিসাবে চিহ্নিত করা যায় না।

এখানে swapTwoInts ( : :) নামে একটি ফাংশনের উদাহরণ রয়েছে , যার দুটি এবং ইন-আউট পূর্ণসংখ্যা পরামিতি রয়েছে যা a এবং b নামে পরিচিত:

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

অদলবদল ( : :) ফাংশনটি খ এর সাথে খ এর মান এবং একটিতে খ এর মান পরিবর্তন করে। অস্থায়ী A নামক অস্থায়ী ধ্রুবকটিতে a এর মান সংরক্ষণ করে, b এর মান নির্ধারণ করে, এবং তারপরে অস্থায়ীA নির্ধারণ করে ফাংশনটি এই অদলবদল সম্পাদন করে।

মানগুলি অদলবদল করতে আপনি দুটি টাইপ ইন্টের ভেরিয়েবলের সাথে swapTwoInts ( : :) ফাংশনটিতে কল করতে পারেন । নোট করুন যে কিছুটি এবং অপর আইনের নামগুলি অ্যাম্পারস্যান্ডের সাথে উপরিবর্তিত হয় যখন সেগুলি অদলবদল ( : :) ফাংশনে পাঠানো হয় :

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"

উপরের উদাহরণটি দেখায় যে কিছুটি এবং অন্যর আইনের মূল মানগুলি swapTwoInts ( : :) ফাংশন দ্বারা পরিবর্তিত হয়েছে , যদিও তারা মূলত ফাংশনের বাইরে সংজ্ঞায়িত হয়েছিল।

বিঃদ্রঃ

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


0

এখানে অন্য ধারণা। আমার ব্যবহারের ক্ষেত্রে এটি যুক্ত করার জন্য একটি স্ট্রিং অ্যারের কাছাকাছি যেতে হয়েছিল, যার জন্য অ্যারেটি পারস্পরিকভাবে পাস করতে হবে। আমি এই জন্য আমার ক্লাসে রাষ্ট্র থাকতে চান না। সুতরাং আমি একটি শ্রেণি তৈরি করেছি যা অ্যারে ধরে আছে এবং এটি পাস করে pass আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে ক্লাস থাকা নির্বোধ বলে মনে হতে পারে যা কেবল একটি পরিবর্তনশীল holds

private class StringBuilder {
    var buffer: [String] = []

    func append(_ str: String) {
        buffer.append(str)
    }

    func toString() -> String {
        return buffer.joined()
    }
}

আমি অ্যারেতে কেবল ব্যবহার করি appendএবং joinedপদ্ধতিগুলি ব্যবহার করি তাই আমার কোডে ন্যূনতম অন্যান্য পরিবর্তনগুলির সাথে টাইপটি পরিবর্তন করা সহজ হয়েছিল।

কিছু উদাহরণ ব্যবহার:

private func writeMap(map: LevelMap, url: URL) -> Bool {
    let buffer = StringBuilder()

    if !writeHeader(map: map, buffer: buffer) {
        return false
    }
    if !writeFloors(map: map, buffer: buffer) {
        return false
    }

    let content = buffer.toString()
    do {
        try content.write(to: url, atomically: true, encoding: .utf8)
        return true
    } catch {}
    return false
}

private func writeHeader(map: LevelMap, buffer: StringBuilder) -> Bool {
    buffer.append("something here ...\n")
    return true
}

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