সুইফ্ট প্রোটোকলে কীভাবে alচ্ছিক পদ্ধতি নির্ধারণ করা যায়?


359

এটি কি সুইফটে সম্ভব? তা না হলে কি তা করার মতো কোনও কাজ আছে?


1
অবশেষে আমি আমার উত্তর আপডেট করতে নিজেকে উত্সাহিত করেছি, আপনি এটি গ্রহণ করে পুনর্বিবেচনা করতে পারেন।
আকাশীবস্কিই

@akashivskyy আমি আপনার উত্তরটি গ্রহণ করি কারণ এটি উপলব্ধ সমস্ত বিকল্প এবং তাদের পক্ষে মতামতকে আরও ভালভাবে প্রদর্শন করে।
সেলভিন

উত্তর:


503

1. ডিফল্ট বাস্তবায়ন ব্যবহার (পছন্দসই)।

protocol MyProtocol {
    func doSomething()
}

extension MyProtocol {
    func doSomething() {
        /* return a default value or just leave empty */
    }
}

struct MyStruct: MyProtocol {
    /* no compile error */
}

সুবিধাদি

  • কোনও উদ্দেশ্য-সি রানটাইম জড়িত নেই (ভাল, কমপক্ষে কোনও স্পষ্টভাবে নয়) ly এর অর্থ আপনি NSObjectএটিতে স্ট্রাক্ট, এনাম এবং নন- ক্লাসগুলি অনুসরন করতে পারেন । এছাড়াও, এর অর্থ আপনি শক্তিশালী জেনেরিক সিস্টেমের সুবিধা নিতে পারেন।

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

অসুবিধেও

  • অ- Voidপ্রয়োজনীয়তার জন্য, আপনার একটি যুক্তিসঙ্গত ডিফল্ট মান থাকা দরকার , যা সর্বদা সম্ভব হয় না। যাইহোক, আপনি যখন এই সমস্যার মুখোমুখি হন, তার অর্থ হ'ল এই জাতীয় প্রয়োজনটির সত্যই কোনও ডিফল্ট বাস্তবায়ন হওয়া উচিত নয়, বা আপনার API ডিজাইনের সময় আপনি ভুল করেছেন।

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

    protocol SomeParserDelegate {
        func validate(value: Any) -> Bool
    }

    যদি আপনি একটি ডিফল্ট বাস্তবায়ন সরবরাহ করেন যা কেবল ফিরে আসে true- এটি প্রথম নজরেই ঠিক আছে। এখন, নিম্নলিখিত সিউডো কোড বিবেচনা করুন:

    final class SomeParser {
        func parse(data: Data) -> [Any] {
            if /* delegate.validate(value:) is not implemented */ {
                /* parse very fast without validating */
            } else {
                /* parse and validate every value */
            }
        }
    }

    এই ধরনের অপ্টিমাইজেশন বাস্তবায়নের কোনও উপায় নেই - আপনার প্রতিনিধি কোনও পদ্ধতি প্রয়োগ করে কিনা তা আপনি জানতে পারবেন না।

    যদিও এই সমস্যাটি কাটিয়ে ওঠার বিভিন্ন উপায় রয়েছে (কয়েকটি নাম রাখার জন্য optionচ্ছিক বন্ধকরণ, বিভিন্ন ক্রিয়াকলাপের জন্য বিভিন্ন প্রতিনিধি অবজেক্টগুলি ব্যবহার করে), উদাহরণটি সমস্যাটিকে স্পষ্টভাবে উপস্থাপন করে।


2. ব্যবহার @objc optional

@objc protocol MyProtocol {
    @objc optional func doSomething()
}

class MyClass: NSObject, MyProtocol {
    /* no compile error */
}

সুবিধাদি

  • কোনও ডিফল্ট বাস্তবায়ন প্রয়োজন হয় না। আপনি কেবল একটি alচ্ছিক পদ্ধতি বা একটি ভেরিয়েবল ঘোষণা করেন এবং আপনি যেতে প্রস্তুত।

অসুবিধেও

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

  • আপনার অবশ্যই সর্বদা যাচাই করা উচিত eitherচ্ছিকভাবে কল করা বা মানানসই টাইপটি প্রয়োগ করে কিনা তা পরীক্ষা করে methodচ্ছিক পদ্ধতি প্রয়োগ করা হয়েছে কিনা। আপনি প্রায়শই alচ্ছিক পদ্ধতিতে কল দিলে এটি প্রচুর বয়লারপ্লেটের সাথে পরিচিত হতে পারে।


17
দ্রুত একটি এক্সটেনশান ব্যবহার করে বিকল্পের পদ্ধতিগুলির উন্নত পদ্ধতির দিকে তাকান (নীচে)
ড্যানিয়েল কানান

1
এবং উদাহরণস্বরূপ কীভাবে একটি alচ্ছিক প্রোটোকল পদ্ধতির সমর্থনের জন্য একটি পরীক্ষা করা যায়? respondsToSelector?
ডিভাইস 1

3
শুধু এই না! সুইফট কোনও কারণে প্রোটোকলে alচ্ছিক পদ্ধতি সমর্থন করে না।
fpg1503

2
এই পদ্ধতিটি পরামিতিগুলিতে বিকল্পগুলি সমর্থন করে না। অর্থাৎ আপনি এটি করতে পারবেন নাoptional func doSomething(param: Int?)
সফট ডিজাইনার

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

394

সুইফট 2 এবং এর পরে কোনও প্রোটোকলের ডিফল্ট বাস্তবায়ন যুক্ত করা সম্ভব। এটি প্রোটোকলগুলিতে alচ্ছিক পদ্ধতিগুলির একটি নতুন উপায় তৈরি করে।

protocol MyProtocol {
    func doSomethingNonOptionalMethod()
    func doSomethingOptionalMethod()
}

extension MyProtocol {
    func doSomethingOptionalMethod(){ 
        // leaving this empty 
    }
}

Alচ্ছিক প্রোটোকল পদ্ধতি তৈরি করার পক্ষে এটি খুব সুন্দর উপায় নয়, তবে প্রোটোকল কলব্যাকগুলিতে স্ট্রাক্ট ব্যবহার করার সম্ভাবনা দেয়।

আমি এখানে একটি ছোট সংক্ষিপ্তসার লিখেছি: https://www.avenderlee.com/swift-2-0/optional-protocol-methods/


2
এটি সম্ভবত সুইফটে এটি করার সবচেয়ে পরিষ্কার উপায়। খুব খারাপ এটি সুইফট ২.০ এর আগে কাজ করে না।
এন্টালপি

13
@ ম্যাটকুইরোস আমি খুঁজে পেয়েছি যে আপনাকে প্রকৃতপক্ষে প্রোটোকল সংজ্ঞায় ফাংশনটি ঘোষণা করতে হবে, অন্যথায় নো-ওপেন এক্সটেনশন ফাংশনটি আপনার ক্লাসগুলিতে প্রলোকলের সাথে সঙ্গতিপূর্ণ হবে না।
ইয়ান পিয়ার্স

3
@ আইয়ানপিয়ার্স সঠিক, এবং এটি নকশা দ্বারা উপস্থিত রয়েছে। ডাব্লুডাব্লুডিসিতে "প্রোটোকল ওরিয়েন্টেড প্রোগ্রামিং" আলাপে (408), তারা মূল প্রোটোকলের পদ্ধতিগুলি সম্পর্কে কথা বলেছিল যেগুলি "কাস্টমাইজেশন পয়েন্ট" হওয়ায় প্রকারের সাথে মানিয়ে যায়। কাস্টমাইজেশনের প্রয়োজনীয় বিন্দু কোনও এক্সটেনশনে কোনও সংজ্ঞা পায় না; একটি .চ্ছিক পয়েন্ট না। প্রোটোকলগুলির যে পদ্ধতিগুলি সাধারণত কাস্টমাইজ করা উচিত নয় সেগুলি সম্পূর্ণরূপে কাস্টমাইজ করার জন্য উপযুক্ত প্রকারগুলি অস্বীকার করার জন্য এক্সটেনশনে ঘোষণা / সংজ্ঞায়িত করা হয় যদি না আপনি কনফর্মারের নিজস্ব পছন্দসই বাস্তবায়ন চান তা দেখাতে নির্দিষ্টভাবে এটির ডায়নামিক টাইপটিতে ফেলে দেওয়া হয় না।
ম্যাথিয়াস

4
@ ফ্র্যাঙ্কলিনইউ আপনি এটি করতে পারেন তবে তারপরে আপনি 'থ্রো' দিয়ে আপনার API নকশাটিকে কলুষিত করছেন যেখানে বাস্তবে এটির প্রয়োজন নেই। আমি "মাইক্রো প্রোটোকল" এর ধারণাটি আরও পছন্দ করি। যেমন প্রতিটি পদ্ধতি একটি প্রোটোকলকে নিশ্চিত করে এবং তারপরে আপনি যাচাই করতে পারেন: যদি বস্তু প্রোটোকল হয়
ডার্কো

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

39

Since চ্ছিক সংশোধক এবং @objc বৈশিষ্ট্যটি কীভাবে ব্যবহার করবেন সে সম্পর্কে কিছু উত্তর রয়েছে answers ঐচ্ছিক প্রয়োজন প্রোটোকল নির্ধারণ করতে, আমি কেমন প্রোটোকল এক্সটেনশন ঐচ্ছিক প্রোটোকল নির্ধারণ ব্যবহার পদ্ধতি সম্পর্কে একটি নমুনা দেব।

কোডের নীচে সুইফট ৩। *

/// Protocol has empty default implementation of the following methods making them optional to implement:
/// `cancel()`
protocol Cancelable {

    /// default implementation is empty.
    func cancel()
}

extension Cancelable {

    func cancel() {}
}

class Plane: Cancelable {
  //Since cancel() have default implementation, that is optional to class Plane
}

let plane = Plane()
plane.cancel()
// Print out *United Airlines can't cancelable*

দয়া করে লক্ষ্য করুন প্রোটোকল এক্সটেনশন পদ্ধতিগুলি উদ্দেশ্য-সি কোড দ্বারা চালিত হতে পারে না এবং আরও খারাপটি হচ্ছে সুইফট টিম এটি ঠিক করবে না। https://bugs.swift.org/browse/SR-492


1
ভাল করেছ! এটি সঠিক উত্তর হওয়া উচিত কারণ এটি উদ্দেশ্যমূলক-সি রানটাইমকে জড়িত না করেই সমস্যার সমাধান করে।
লুকাস

সত্যিই খুব সুন্দর!
তানিয়া_১১

সুইফ্ট ডকুমেন্টেশন থেকে - "এক্সটেনশন দ্বারা সরবরাহিত ডিফল্ট বাস্তবায়ন সহ প্রোটোকল প্রয়োজনীয়তা alচ্ছিক প্রোটোকল প্রয়োজনীয়তা থেকে পৃথক Although
মেক ওস

34

প্রোটোকলটিকে "@objc" হিসাবে চিহ্নিত করার সাথে জড়িত অন্যান্য উত্তরগুলি সুইফট-নির্দিষ্ট ধরণের ব্যবহারের সময় কার্যকর হয় না।

struct Info {
    var height: Int
    var weight: Int
} 

@objc protocol Health {
    func isInfoHealthy(info: Info) -> Bool
} 
//Error "Method cannot be marked @objc because the type of the parameter cannot be represented in Objective-C"

দ্রুতগতির সাথে ভালভাবে কাজ করে এমন optionচ্ছিক প্রোটোকলগুলি ঘোষণার জন্য, ফাংশনগুলিকে ফানকের পরিবর্তে ভেরিয়েবল হিসাবে ঘোষণা করুন।

protocol Health {
    var isInfoHealthy: (Info) -> (Bool)? { get set }
}

এবং তারপরে নীচে প্রোটোকলটি প্রয়োগ করুন

class Human: Health {
    var isInfoHealthy: (Info) -> (Bool)? = { info in
        if info.weight < 200 && info.height > 72 {
            return true
        }
        return false
    }
    //Or leave out the implementation and declare it as:  
    //var isInfoHealthy: (Info) -> (Bool)?
}

তারপরে আপনি "ব্যবহার করতে পারেন?" ফাংশনটি কার্যকর হয়েছে কিনা তা যাচাই করতে to

func returnEntity() -> Health {
    return Human()
}

var anEntity: Health = returnEntity()

var isHealthy = anEntity.isInfoHealthy(Info(height: 75, weight: 150))? 
//"isHealthy" is true

3
এই সমাধানের মাধ্যমে আপনি কোনও প্রোটোকল ফাংশন থেকে স্ব অ্যাক্সেস করতে পারবেন না। এটি কিছু ক্ষেত্রে সমস্যা হতে পারে!
জর্জ গ্রিন

1
@ জর্জিগ্রিন আপনি নিজেরাই অ্যাক্সেস করতে পারবেন। অলস হিসাবে ফাংশন পরিবর্তনশীল চিহ্নিত করুন এবং বন্ধের অভ্যন্তরে ক্যাপচার তালিকাটি ব্যবহার করুন ।
জাগ

কেবল ক্লাস, প্রোটোকল, পদ্ধতি এবং বৈশিষ্ট্যগুলি @objc ব্যবহার করতে পারে। আপনি যদি @ অজাব্যাক প্রোটোকল পদ্ধতি সংজ্ঞায় কোনও এনাম প্যারামিটার ব্যবহার করছেন তবে আপনি বিনষ্ট হয়ে গেছেন।
খুনশান

1
@ খুনশান, এই পদ্ধতির কোনও কিছুর জন্য @ অবজেক চিহ্নিত হওয়ার দরকার নেই, আপনি কী উল্লেখ করছেন?
জাগ

এটি বিষয়টির একটি তথ্য যা এনামগুলি দ্রুত এবং অবজেক্টের মধ্যে ব্যবহার করা যায় না যা অন্যান্য বিবৃতিগুলিকে @ ওবিজেসি কীওয়ার্ড দিয়ে ব্রিজ করা যায়।
খুনশান

34

এখানে প্রতিনিধি নিদর্শন সহ একটি দৃ concrete় উদাহরণ।

আপনার প্রোটোকল সেটআপ করুন:

@objc protocol MyProtocol:class
{
    func requiredMethod()
    optional func optionalMethod()
}

class MyClass: NSObject
{
    weak var delegate:MyProtocol?

    func callDelegate()
    {
        delegate?.requiredMethod()
        delegate?.optionalMethod?()
    }
}

প্রতিনিধিটিকে কোনও শ্রেণিতে সেট করুন এবং প্রোটোকলটি প্রয়োগ করুন। দেখুন যে alচ্ছিক পদ্ধতিটি প্রয়োগ করার দরকার নেই।

class AnotherClass: NSObject, MyProtocol
{
    init()
    {
        super.init()

        let myInstance = MyClass()
        myInstance.delegate = self
    }

    func requiredMethod()
    {
    }
}

একটি গুরুত্বপূর্ণ বিষয় thatচ্ছিক পদ্ধতিটি alচ্ছিক এবং একটি "প্রয়োজন?" কল করার সময় দ্বিতীয় প্রশ্ন চিহ্ন উল্লেখ করুন।

delegate?.optionalMethod?()

2
এটি সঠিক উত্তর হওয়া উচিত। সহজ, পরিষ্কার এবং ব্যাখ্যামূলক।
এচেলন

আমি সম্মত, এই উত্তরটি সংক্ষিপ্ত, মিষ্টি এবং সোজা কথা। ধন্যবাদ!
LuAndre

31

ইন সুইফট 3.0

@objc protocol CounterDataSource {
    @objc optional func increment(forCount count: Int) -> Int
    @objc optional var fixedIncrement: Int { get }
}

এটি আপনার সময় সাশ্রয় করবে।


6
কেন @objcএখন কোন সদস্যের সমস্ত সদস্যের প্রয়োজন?
ডিভ্যান্ডআর্টিস্ট

@ গৌতম সারেরিয়া: আপনার কাছে কী মনে হয় এই পদ্ধতিকে বা খালি সম্প্রসারণের পদ্ধতি তৈরি করা সবচেয়ে ভাল?
এনিস্ট

requiredপতাকা দিয়ে আপনার পদ্ধতিগুলি দিয়ে চেষ্টা করেছি , তবে ত্রুটি সহ: requiredকেবলমাত্র 'init' ঘোষণায় ব্যবহার করা যেতে পারে।
বেন

27
  • optionalপ্রতিটি পদ্ধতির আগে আপনাকে কীওয়ার্ড যুক্ত করতে হবে।
  • তবে দয়া করে নোট করুন, এটি কাজ করার জন্য আপনার প্রোটোকলটি অবশ্যই @objc বৈশিষ্ট্যের সাথে চিহ্নিত করতে হবে।
  • এটি আরও বোঝায় যে এই প্রোটোকলটি কাঠামোগত নয় ক্লাসে প্রযোজ্য হবে।

গৌণ সংশোধন (সম্পাদনা করার জন্য খুব ছোট!) তবে এটি 'opচ্ছিক' হওয়া উচিত '@ বিকল্প' নয়
আলি বিডল

5
এটির জন্য আপনার প্রোটোকলটি @objcকেবল প্রোটোকল হিসাবে নয়, রূপায়ণকারী হিসাবে চিহ্নিত করা উচিত।
জনাথন সুলিংগার

13

প্রোটোকল উত্তরাধিকার সহ একটি খাঁটি সুইফ্ট পদ্ধতি:

//Required methods
protocol MyProtocol {
    func foo()
}

//Optional methods
protocol MyExtendedProtocol: MyProtocol {
    func bar()
}

class MyClass {
    var delegate: MyProtocol
    func myMethod() {
        (delegate as? MyExtendedProtocol).bar()
    }
}

11

আন্তোইনের উত্তরের যান্ত্রিকতাকে চিত্রিত করার জন্য:

protocol SomeProtocol {
    func aMethod()
}

extension SomeProtocol {
    func aMethod() {
        print("extensionImplementation")
    }
}

class protocolImplementingObject: SomeProtocol {

}

class protocolImplementingMethodOverridingObject: SomeProtocol {
    func aMethod() {
        print("classImplementation")
    }
}

let noOverride = protocolImplementingObject()
let override = protocolImplementingMethodOverridingObject()

noOverride.aMethod() //prints "extensionImplementation"
override.aMethod() //prints "classImplementation"

8

আমি মনে করি যে আপনি কীভাবে একটি alচ্ছিক প্রোটোকল পদ্ধতি বাস্তবায়ন করতে পারেন তা জিজ্ঞাসা করার আগে আপনাকে জিজ্ঞাসা করা উচিত কেন আপনার একটি প্রয়োগ করা উচিত।

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

আরও পড়ার জন্য, https://useyourloaf.com/blog/swift-optional-protocol-methods/ দেখুন , যা এই বিষয়ে একটি দুর্দান্ত ধারণা দেয়।


এই. এটা তোলে আনুগত্য এর "আমি" মধ্যে নীতি কঠিন সফটওয়্যার উন্নয়ন নীতির
এরিক

7

মূল প্রশ্নটি থেকে সামান্য বিষয় ছাড়াই, তবে এটি এন্টোইনের ধারণাটি বন্ধ করে দিয়েছে এবং আমি ভেবেছিলাম এটি কারও সাহায্য করতে পারে।

আপনি প্রোটোকল এক্সটেনশানগুলির সাথে স্ট্রকের জন্য গণিত বৈশিষ্ট্যগুলি alচ্ছিকও করতে পারেন।

আপনি theচ্ছিকভাবে প্রোটোকলে একটি সম্পত্তি তৈরি করতে পারেন

protocol SomeProtocol {
    var required: String { get }
    var optional: String? { get }
}

প্রোটোকল এক্সটেনশনে ডামি গণিত সম্পত্তি প্রয়োগ করুন

extension SomeProtocol {
    var optional: String? { return nil }
}

এবং এখন আপনি এমন স্ট্রাইক ব্যবহার করতে পারেন যা alচ্ছিক সম্পত্তি প্রয়োগ করে বা না করে

struct ConformsWithoutOptional {
    let required: String
}

struct ConformsWithOptional {
    let required: String
    let optional: String?
}

আমি আমার ব্লগে সুইফট প্রোটোকলগুলিতে কীভাবে .চ্ছিক বৈশিষ্ট্যগুলি করব তাও লিখেছি , যা সুইফট 2 রিলিজের মাধ্যমে জিনিসগুলি পরিবর্তিত হলে আমি আপডেট রাখব।


5

Howচ্ছিক এবং প্রয়োজনীয় প্রতিনিধি পদ্ধতি কীভাবে তৈরি করবেন।

@objc protocol InterViewDelegate:class {

    @objc optional func optfunc()  //    This is optional
    func requiredfunc()//     This is required 

}

3

কেবলমাত্র সুইফ্ট ক্লাসির জন্য খুব সাধারণ উদাহরণ, এবং কাঠামো বা অঙ্কের জন্য নয়। নোট করুন যে প্রোটোকল পদ্ধতিটি beingচ্ছিক, খেলায় দুটি স্তরের alচ্ছিক চেইন রয়েছে। এছাড়াও প্রোটোকল গ্রহণকারী শ্রেণীর ঘোষণায় @objc বৈশিষ্ট্য প্রয়োজন।

@objc protocol CollectionOfDataDelegate{
   optional func indexDidChange(index: Int)
}


@objc class RootView: CollectionOfDataDelegate{

    var data = CollectionOfData()

   init(){
      data.delegate = self
      data.indexIsNow()
   }

  func indexDidChange(index: Int) {
      println("The index is currently: \(index)")
  }

}

class CollectionOfData{
    var index : Int?
    weak var delegate : CollectionOfDataDelegate?

   func indexIsNow(){
      index = 23
      delegate?.indexDidChange?(index!)
    }

 }

আপনি একটি সামান্য আরো "বর্ণনা করতে পারেন দুই খেলার সময়ে ঐচ্ছিক মাত্রা " অংশ, যথা এই: delegate?.indexDidChange?(index!)?
আনহেলিগ

2
আমরা যদি প্রোটোকলটি এই জাতীয় একটি অ-alচ্ছিক পদ্ধতিতে লিখে থাকি: protocol CollectionOfDataDelegate{ func indexDidChange(index: Int) } তবে আপনি প্রশ্ন চিহ্ন ছাড়াই এটিকে ডাকতেন: delegate?.indexDidChange(index!) আপনি যখন কোনও প্রোটোকলে কোনও পদ্ধতির জন্য alচ্ছিক প্রয়োজনীয়তা নির্ধারণ করেন, তখন যে ধরণটি এটি মেনে চলবে সে পদ্ধতিটি প্রয়োগ করতে পারে না , তাই ?প্রয়োগটি পরীক্ষা করার জন্য ব্যবহৃত হয় এবং যদি কিছুই না থাকে তবে প্রোগ্রামটি ক্রাশ হবে না। @ উনিহিলিগ
আশীর্বাদ লোপস

weak var delegate : CollectionOfDataDelegate?(দুর্বল রেফারেন্স নিশ্চিত করুন?)
অ্যালফি হ্যানসেন

@BlessingLopes আপনি কি delegate?আপনার উত্তরের ব্যবহারের ব্যাখ্যাটি যুক্ত করতে পারেন ? ভবিষ্যতে অন্যদের কাছে সেই তথ্যটি সত্যই অন্তর্ভুক্ত থাকা উচিত। আমি এটি আপভোট করতে চাই, তবে সেই তথ্যটি সত্যই উত্তরে থাকা উচিত।
জনাথন সুলিঞ্জার 19

3

যদি আপনি বিশুদ্ধ দ্রুতগতি এটা কাজ করতে চান সবচেয়ে ভালো উপায় একটি ডিফল্ট বাস্তবায়ন particullary প্রদান আপনি উদাহরণস্বরূপ মত একটি সুইফট টাইপ আসতে হয় struct হয় সুইফট ধরনের সঙ্গে

উদাহরণ:

struct magicDatas {
    var damagePoints : Int?
    var manaPoints : Int?
}

protocol magicCastDelegate {
    func castFire() -> magicDatas
    func castIce() -> magicDatas
}

extension magicCastDelegate {
    func castFire() -> magicDatas {
        return magicDatas()
    }

    func castIce() -> magicDatas {
        return magicDatas()
    }
}

তারপরে আপনি প্রতিটি ফানকে সংজ্ঞায়িত না করে প্রোটোকল প্রয়োগ করতে পারেন


2

সুইফট প্রোটোকলে আপনি alচ্ছিক পদ্ধতি তৈরি করতে পারেন এমন দুটি উপায় রয়েছে।

1 - প্রথম বিকল্পটি হল @objc বৈশিষ্ট্যটি ব্যবহার করে আপনার প্রোটোকলটি চিহ্নিত করা। যদিও এর অর্থ এটি কেবল শ্রেণি দ্বারা গৃহীত হতে পারে, এর অর্থ এই নয় যে আপনি পৃথক পদ্ধতিগুলি এই জাতীয় optionচ্ছিক হিসাবে চিহ্নিত করেছেন:

@objc protocol MyProtocol {
    @objc optional func optionalMethod()
}

2 - একটি দ্রুত উপায়: এই বিকল্পটি আরও ভাল। Nothingচ্ছিক পদ্ধতিগুলির ডিফল্ট প্রয়োগগুলি লিখুন যা এর মতো কিছুই করে না।

protocol MyProtocol {
    func optionalMethod()
    func notOptionalMethod()
}

extension MyProtocol {

    func optionalMethod() {
        //this is a empty implementation to allow this method to be optional
    }
}

সুইফটের এক্সটেনশন নামে একটি বৈশিষ্ট্য রয়েছে যা আমাদের methodsচ্ছিক হতে চাই এমন পদ্ধতির জন্য একটি ডিফল্ট বাস্তবায়ন সরবরাহ করতে দেয়।


0

একটি বিকল্প হ'ল optionচ্ছিক ফাংশন ভেরিয়েবল হিসাবে তাদের সংরক্ষণ করা:

struct MyAwesomeStruct {
    var myWonderfulFunction : Optional<(Int) -> Int> = nil
}

let squareCalculator =
    MyAwesomeStruct(myWonderfulFunction: { input in return input * input })
let thisShouldBeFour = squareCalculator.myWonderfulFunction!(2)

-1

প্রোটোকলে ফাংশনটি সংজ্ঞায়িত করুন এবং সেই প্রোটোকলের জন্য এক্সটেনশন তৈরি করুন, তারপরে ফাংশনটির জন্য খালি বাস্তবায়ন তৈরি করুন যা আপনি alচ্ছিক হিসাবে ব্যবহার করতে চান।


-2

নির্ধারণ করতে Optional Protocolদ্রুতগতি আপনি ব্যবহার করা উচিত @objcআগে শব্দ Protocolঘোষণা এবং attribute/ methodযে প্রোটোকল ভিতরে ঘোষণা। নীচে একটি প্রোটোকলের ptionচ্ছিক সম্পত্তির নমুনা দেওয়া আছে।

@objc protocol Protocol {

  @objc optional var name:String?

}

class MyClass: Protocol {

   // No error

}

2
যদিও এই প্রশ্নের উত্তর দিতে পারে তবে এই উত্তরটি কীভাবে সমস্যা সমাধানে সহায়তা করতে পারে সে সম্পর্কে কিছু বিবরণ যুক্ত করা ভাল। আরও জানতে আমি কীভাবে একটি ভাল উত্তর লিখব দয়া করে পড়ুন ।
রোশন পিটিগালা

-23

@optionalপদ্ধতি বা বৈশিষ্ট্যের সামনে রাখুন ।


সংকলক ত্রুটি: 'alচ্ছিক' বৈশিষ্ট্যটি কেবলমাত্র @objc প্রোটোকলের সদস্যদের জন্য প্রয়োগ করা যেতে পারে।
সেলভিন

3
@optionalএমনকি সঠিক কীওয়ার্ড নয়। এটি optional, এবং আপনাকে অবশ্যই ক্লাস এবং প্রোটোকল বুদ্ধির গুণাবলীটি ঘোষণা করতে হবে @objc
জনাথন সুলিংগার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.