এক্সকোড 8 / সুইফট 3: "ইউআইভিউউকন্ট্রোলারের ধরণের অভিব্যক্তি? সতর্কতা হ'ল অব্যবহৃত "


230

আমি নিম্নলিখিত ফাংশনটি পেয়েছি যা পূর্বে পরিষ্কারভাবে সংকলিত হয়েছে তবে এক্সকোড 8 দিয়ে একটি সতর্কতা উত্পন্ন করে।

func exitViewController()
{
    navigationController?.popViewController(animated: true)
}

"" ইউআইভিউউকন্ট্রোলার? "প্রকারের এক্সপ্রেশনটি অব্যবহৃত"।

এটি কেন এটি বলছে এবং এটি সরানোর কোনও উপায় আছে?

প্রত্যাশিত কোডটি কার্যকর করে।

উত্তর:


498

টি এল; ডিআর

popViewController(animated:)ফিরে আসে UIViewController?, এবং সংকলক সেই সতর্কতা দিচ্ছে যেহেতু আপনি মানটি ক্যাপচার করছেন না। সমাধানটি হ'ল এটিকে একটি আন্ডারস্কোর এ নিয়োগ করা:

_ = navigationController?.popViewController(animated: true)

সুইফট 3 পরিবর্তন

সুইফ্ট 3 এর আগে, সমস্ত পদ্ধতির ডিফল্টরূপে "বাতিলযোগ্য ফলাফল" ছিল। আপনি কী পদ্ধতিটি ফিরে আসলেন তা ক্যাপচার না করলে কোনও সতর্কতা আসবে না।

সংকলকটিকে ফলাফলটি ক্যাপচার করতে হবে তা বলার জন্য আপনাকে @warn_unused_resultপদ্ধতির ঘোষণার আগে আপনাকে যুক্ত করতে হয়েছিল । এটি এমন পদ্ধতির জন্য ব্যবহৃত হবে যেগুলির পরিবর্তনীয় ফর্ম রয়েছে (প্রাক্তন sortএবং sortInPlace)। আপনি @warn_unused_result(mutable_variant="mutableMethodHere")এটির সংকলকটি বলার জন্য যুক্ত করবেন।

তবে সুইফট 3 এর সাথে আচরণটি উল্টে গেছে। সমস্ত পদ্ধতি এখন সতর্ক করে যে রিটার্নের মানটি ধরা পড়ে না। আপনি যদি সংকলককে বলতে চান যে সতর্কতাটি প্রয়োজনীয় নয়, আপনি @discardableResultপদ্ধতি ঘোষণার আগে যুক্ত করুন ।

আপনি যদি রিটার্ন মানটি ব্যবহার করতে না চান তবে আপনাকে স্পষ্টভাবে একটি আন্ডারস্কোরকে অর্পণ করে সংকলকটি বলতে হবে:

_ = someMethodThatReturnsSomething()

এটি সুইফট 3 এ যুক্ত করার জন্য প্রেরণা:

  • সম্ভাব্য বাগ প্রতিরোধ (উদাঃ sortচিন্তা করে এটি সংগ্রহকে সংশোধন করে)
  • ক্যাপচার না করার বা অন্য সহযোগীদের জন্য ফলাফল ক্যাপচার করার প্রয়োজনের সুস্পষ্ট অভিপ্রায়

ইউআইকিট এপিআই এর পিছনে রয়েছে বলে মনে হচ্ছে, @discardableResultপুরোপুরি সাধারণ (যদি আরও সাধারণ না হয় তবে) popViewController(animated:)রিটার্ন মান ক্যাপচার না করে ব্যবহার না করে।

আরও পড়ুন


15
এই (আমার মতে) স্পষ্টভাবে সুইফট 2 থেকে এক ধাপ পেছনে, বিশেষত যখন এই যে, যদিও তারা মত পদ্ধতি কি কোন মান ফিরিয়ে সেখানে পুরোপুরি বৈধ ব্যবহারের ক্ষেত্রে যেখানে আপনি শুধু এটা ব্যবহার করবেন না হয়।
নিকোলাস মিয়ারি

15
1. আপনার দরকার নেই let: আপনি কেবল এর আগে letবা এর আগেই _ ঠিক করতে পারেন var
রিক্সার

1
@ কৌশলগুলি উত্তরটি যোগ করবে তা জানতেন না।
tktsubota

5
২. নিকোলাসমিয়ারি একটি বাগ ফাইল করুন@discardableResultফাংশনগুলির জন্য একটি টীকা ( ) রয়েছে যা কোনও মান ফেরত দেয় তবে যেখানে প্রত্যাশা করা হয় যে কেউ প্রত্যাবর্তন মানটিকে অগ্রাহ্য করতে পারে। UIKit সবেমাত্র তাদের এপিটিতে সেই টিকাটি প্রয়োগ করেনি।
রিকটর

37
এটি ভয়াবহ সিনট্যাক্স। কেন তারা এই কাজ করবে? ইশ।
ডেভিড এস

38

যখন জীবন আপনাকে লেবু দেয়, একটি এক্সটেনশন করুন:

import UIKit

extension UINavigationController {
    func pop(animated: Bool) {
        _ = self.popViewController(animated: animated)
    }

    func popToRoot(animated: Bool) {
        _ = self.popToRootViewController(animated: animated)
    }
}

নোট করুন যে এর মতো কিছু যুক্ত করার @discardableResult func pop(animated: Bool) -> UIViewController?ফলে একই সতর্কতাটি আপনি এড়াতে চেষ্টা করছেন এর ফলাফল হবে।

এক্সটেনশন সহ আপনি এখন লিখতে পারেন:

func exitViewController()
{
    navigationController?.pop(animated: true)
}

func popToTheRootOfNav() {
    navigationController?.popToRoot(animated: true)
}

সম্পাদনা করুন: পপটোরোটও যুক্ত হয়েছে।


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

24

সুইফ্ট 3-এ, কোনও ক্রিয়াকলাপের রিটার্ন মানটিকে অগ্রাহ্য করা যা সতর্কতাতে ঘোষিত ফেরতের মান ফলাফল।

এ থেকে বেরিয়ে আসার একটি উপায় হ'ল @discardableResultবৈশিষ্ট্যটির সাথে ফাংশনটি চিহ্নিত করা। যেহেতু আপনার এই ফাংশনটির নিয়ন্ত্রণ নেই, এটি কাজ করবে না।

সতর্কতা থেকে মুক্তি পাওয়ার জন্য অন্য পদ্ধতিটি হ'ল মান নির্ধারণ করা _। এটি সংকলককে জানায় আপনি জানেন যে পদ্ধতিটি একটি মান দেয় তবে আপনি এটিকে স্মৃতিতে ধরে রাখতে চান না।

let _ = navigationController?.popViewController(animated: true)

2
আমি অনুমান করি যে _অ্যাপল এই নতুন বৈশিষ্ট্যটির সাথে ইউআইকিট আপডেট না করে আমাদের কুৎসিতের সাথে থাকতে হবে।
নিকোলাস মিয়ারি

2
দুর্ভাগ্যক্রমে @discardableResultকাজ করে না (কমপক্ষে এটি 8b4 দিয়ে এখনও কুটিল)। ফ্রিডরিচ শিলার পচা আপেল পছন্দ করতেন। সম্ভবত স্বাদের বিষয় :-(
কিওয়ার্টি_সো

5

স্ক্রিনশট ঘ

যদিও এটি work correctly if kept as it isকিন্তুnumber of warning increases.

সমাধানটি কেবল replace it with underscore ( _ )কুৎসিত বলে মনে হলেও এটি।

Eg.  _ = navigationController?.popViewController(animated: true)

স্ক্রিনশট 2


2

এই অবস্থায় বিসর্জনযোগ্য ফলাফল ব্যবহার করুন ।

<সুইফ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ> অনুসারে, অধ্যায় ভাষার রেফারেন্স - বৈশিষ্ট্য।

discardableResult

এই ফাংশন বা পদ্ধতি ঘোষণায় এই বৈশিষ্ট্যটি প্রয়োগ করুন সংকলক সতর্কতা দমন করার জন্য যখন কোনও ফাংশন বা পদ্ধতি যা কোনও মান প্রদান করে তার ফলাফলটি ব্যবহার না করে ডাকা হয়।

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//apple_ref/doc/uid/TP40014097-CH35-ID347

<সুইফ্ট প্রোগ্রামিং ভাষা>, অধ্যায় ভাষা গাইড - পদ্ধতিগুলির একটি ডেমোও রয়েছে।

@discardableResult
    mutating func advance(to level: Int) -> Bool {
    ...
return true
}

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

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-ID234


0

আপনি যদি কোডআরপের উত্তরগুলির মতো এক্সটেনশনের রাস্তায় যেতে চান তবে আপনার ব্যবহার করা উচিত @descardableResult। এটি সমস্ত সম্ভাবনা রাখে, তবে সতর্কতাটি স্থির করে দেয়।

import UIKit

extension UINavigationController {
    @discardableResult func pop(animated: Bool) -> UIViewController? {
        return self.popViewController(animated: animated)
    }

    @discardableResult func popToRoot(animated: Bool) -> [UIViewController]? {
        return self.popToRootViewController(animated: animated)
    }
}

-1

আরেকটি উপায় হ'ল আপনি self.navigationController?মানটি আনপ্রেপ করে ফাংশনটিতে কল করতে পারেন popViewController

    if let navigationController = navigationController {
        navigationController.popViewController(animated: true)
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.