একাধিক ধরণের স্যুইফটে সীমাবদ্ধতা


133

ধরা যাক আমার কাছে এই প্রোটোকল রয়েছে:

protocol SomeProtocol {

}

protocol SomeOtherProtocol {

}

এখন, আমি যদি একটি এমন ফাংশন চাই যা জেনেরিক ধরণের হয় তবে সেই ধরণেরটি অবশ্যই আমার সাথে মেনে চলতে SomeProtocolহবে:

func someFunc<T: SomeProtocol>(arg: T) {
    // do stuff
}

তবে একাধিক প্রোটোকলের জন্য কোনও ধরণের বাধা যুক্ত করার কোনও উপায় আছে কি?

func bothFunc<T: SomeProtocol | SomeOtherProtocol>(arg: T) {

}

অনুরূপ জিনিসগুলি কমা ব্যবহার করে তবে এই ক্ষেত্রে এটি আলাদা ধরণের ঘোষণা শুরু করবে। আমি যা চেষ্টা করেছি তা এখানে।

<T: SomeProtocol | SomeOtherProtocol>
<T: SomeProtocol , SomeOtherProtocol>
<T: SomeProtocol : SomeOtherProtocol>

এটি একটি বিশেষ প্রাসঙ্গিক প্রশ্ন কারণ সুইফ্ট ডকস জেনেরিক অধ্যায়টিতে এটি উল্লেখ করে না ...
ব্রুনো ফিলিপ

উত্তর:


241

আপনি এমন একটি ক্লজ ব্যবহার করতে পারেন যা আপনাকে কমা দ্বারা পৃথক করে যতগুলি প্রয়োজনীয়তা (যা সমস্ত অবশ্যই পূরণ করতে হবে) নির্দিষ্ট করতে দেয়

সুইফট 2:

func someFunc<T where T:SomeProtocol, T:SomeOtherProtocol>(arg: T) {
    // stuff
}

সুইফট 3 এবং 4:

func someFunc<T: SomeProtocol & SomeOtherProtocol>(arg: T) {
    // stuff
}

বা আরও শক্তিশালী যেখানে ধারা:

func someFunc<T>(arg: T) where T:SomeProtocol, T:SomeOtherProtocol{
    // stuff
}

আপনি অবশ্যই প্রোটোকল রচনা (যেমন, protocol<SomeProtocol, SomeOtherProtocol>) ব্যবহার করতে পারেন তবে এটি কিছুটা কম নমনীয়।

ব্যবহারের ফলে whereআপনি একাধিক প্রকারের সাথে জড়িত সেই ক্ষেত্রে মোকাবেলা করতে পারবেন।

আপনি এখনও একাধিক স্থানে পুনঃব্যবহারের জন্য প্রোটোকল রচনা করতে বা কেবল রচিত প্রোটোকলকে একটি অর্থপূর্ণ নাম দিতে চাইতে পারেন।

সুইফট 5:

func someFunc(arg: SomeProtocol & SomeOtherProtocol) { 
    // stuff
}

প্রোটোকল যুক্তির পাশে থাকায় এটি আরও প্রাকৃতিক বোধ করে।


গীজ এটি যৌক্তিক নয়, তবে আমি কেবল এটির জন্য ধন্যবাদ স্প্যামারদের মধ্যে একটি হতে চাই তা জানতে পেরে ভাল লাগবে না, 'যেহেতু আমার এটির প্রয়োজন ছিল এক মাসেই তা বুঝতে পারিনি।
ম্যাথিজস সেগার্স

3
টাইপ কনট্রিন্ট এক্সপ্রেশনে ক্লাস এবং স্ট্রাক্টগুলির সাথে একই জিনিস করার কোনও উপায়? যেমন <T where T:SomeStruct, T:AnotherStruct>? ক্লাসগুলির জন্য সংকলকটি "টি উভয়ের একটি সাবক্লাস" বলে ব্যাখ্যা করার জন্য উপস্থিত হয় এবং স্ট্রাইকগুলির জন্য এটি কেবল এটির অভিযোগ করে "Type 'T' constrained to non-protocol type"
জারোদ স্মিথ

ওপিতে সুনির্দিষ্ট উদাহরণের জন্য প্রশ্নগুলির প্রোটোকল রচনাটি পছন্দনীয় পদ্ধতি হওয়া উচিত : উপরের সমাধানটি বৈধ, তবে, imho, অকারণে ফাংশনের স্বাক্ষরকে বিশৃঙ্খলা করে। এছাড়াও, প্রোটোকল রচনা হিসাবে উদাহরণস্বরূপ, একটি টাইপ সীমাবদ্ধতা ব্যবহার করে, আপনাকে whereঅতিরিক্ত টাইপ / অন্যান্য ব্যবহারের func someFunc<U, T: protocol<SomeProtocol, SomeOtherProtocol> where T.SubType == U>(arg: T, arg2: U) { ... }জন্য উদাহরণটি SubTypeযেমন টাইপালিয়াসের জন্য ব্যবহার করতে দেয় SomeProtocol
dfri

1
দেখে মনে হচ্ছে এটি সুইফট 3-এ অবচিত করা হয়েছে এবং এটি ব্যবহারের পরামর্শ দিচ্ছে: ফানক কিছুফানক <টি> (যুক্তি: টি) যেখানে টি: সোমারপ্রোটোকল, টি: সামোথারপ্রোটোকল {
ক্রিসটি ব্লু

2
দ্রুতগতির বলার কোনও উপায় আছে যে টি নির্দিষ্ট বস্তুর ধরণের হওয়া উচিত এবং একটি নির্দিষ্ট প্রোটোকল প্রয়োগ করা উচিত?
গেয়র্গ

73

আপনার দুটি সম্ভাবনা রয়েছে:

  1. আপনি জিয়ারোর উত্তরে নির্দেশিত একটি ধারা ব্যবহার করেছেন :

    func someFunc<T where T : SomeProtocol, T : SomeOtherProtocol>(arg: T) {
        // do stuff
    }
  2. আপনি একটি প্রোটোকল রচনা প্রকার ব্যবহার করুন :

    func someFunc<T : protocol<SomeProtocol, SomeOtherProtocol>>(arg: T) {
        // do stuff
    }

2
ইমো দ্বিতীয় সমাধানটি সুন্দর, আমি এই উত্তরটির জন্য যেতে চাই এটি আরও দুটি বিকল্প উপস্থাপন করার জন্য আরও সম্পূর্ণ
ম্যাথিজস সেগারস

2
2 নাম্বারটি হ'ল একমাত্র যা আমার কাছে A ঘোষণা করার সময় সুইফট 2 এর অধীনে কাজ করে typealias। ধন্যবাদ!
ব্রুনো ফিলিপ 21

19

সুইফট ৩.০-তে বিবর্তন কিছু পরিবর্তন নিয়ে আসে। আমাদের দুটি পছন্দ এখন অন্যরকম দেখাচ্ছে।

whereসুইফট 3.0.০ এ একটি ধারা ব্যবহার করা :

whereপঠনযোগ্যতা উন্নত করার জন্য এই ধারাটি এখন একটি ফাংশনের স্বাক্ষরের শেষে চলে গেছে। তাই একাধিক প্রোটোকল উত্তরাধিকার এখন এর মতো দেখাচ্ছে:

func someFunc<T>(arg: T) where T:SomeProtocol, T:SomeOtherProtocol {

}

protocol<>সুইফট 3.0.০ তে কনস্ট্রাক্ট ব্যবহার করা হচ্ছে :

protocol<>কনস্ট্রাক্ট ব্যবহার করে রচনাটি হ্রাস করা হচ্ছে। আগেরটি protocol<SomeProtocol, SomeOtherProtocol>এখন এর মতো দেখাচ্ছে:

func someFunc<T:SomeProtocol & SomeOtherProtocol>(arg: T) {

}

তথ্যসূত্র।

এর জন্য পরিবর্তনগুলি সম্পর্কিত আরও তথ্য whereএখানে: https://github.com/apple/swift-evolution/blob/master/proposals/0081-move-where-expression.md

এবং, প্রোটোকল <> কনস্ট্রাক্টের পরিবর্তনগুলি সম্পর্কে এখানে আরও রয়েছে: https://github.com/apple/swift-evolution/blob/master/proposals/0095-any-as-existential.md


13

আপনার কার্যকারিতাটি ঘোষণার জন্য সুইফট 3 টি 3 টি বিভিন্ন উপায়ে অফার করে।

protocol SomeProtocol {
    /* ... */
}

protocol SomeOtherProtocol {
    /* ... */        
}

1. &অপারেটর ব্যবহার

func someFunc<T: SomeProtocol & SomeOtherProtocol>(arg: T) {
    /* ... */
}

2. whereধারা ব্যবহার করা

func someFunc<T>(arg: T) where T: SomeProtocol, T: SomeOtherProtocol {
    /* ... */
}

৩. whereধারা এবং &অপারেটর ব্যবহার করা

func someFunc<T>(arg: T) where T: SomeProtocol & SomeOtherProtocol {
    /* ... */        
}

এছাড়াও মনে রাখবেন যে আপনি typealiasআপনার ফাংশন ঘোষণাটি সংক্ষিপ্ত করতে ব্যবহার করতে পারেন ।

typealias RequiredProtocols = SomeProtocol & SomeOtherProtocol

func someFunc<T: RequiredProtocols>(arg: T) {
    /* ... */   
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.