এটি কি সুইফটে সম্ভব? তা না হলে কি তা করার মতো কোনও কাজ আছে?
এটি কি সুইফটে সম্ভব? তা না হলে কি তা করার মতো কোনও কাজ আছে?
উত্তর:
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চ্ছিক বন্ধকরণ, বিভিন্ন ক্রিয়াকলাপের জন্য বিভিন্ন প্রতিনিধি অবজেক্টগুলি ব্যবহার করে), উদাহরণটি সমস্যাটিকে স্পষ্টভাবে উপস্থাপন করে।
@objc optional
।@objc protocol MyProtocol {
@objc optional func doSomething()
}
class MyClass: NSObject, MyProtocol {
/* no compile error */
}
সুবিধাদি
অসুবিধেও
সমস্ত প্রযোজ্য ধরণের উদ্দেশ্য-সি সামঞ্জস্যপূর্ণ হওয়ার জন্য এটি আপনার প্রোটোকলের ক্ষমতাগুলি মারাত্মকভাবে সীমাবদ্ধ করে। এর অর্থ, উত্তরাধিকার সূত্রে প্রাপ্ত ক্লাসগুলিই কেবল এই NSObject
জাতীয় প্রোটোকলের সাথে সামঞ্জস্য করতে পারে। কোনও স্ট্রাক, কোনও এনামস, কোনও প্রকার সম্পর্কিত নয়।
আপনার অবশ্যই সর্বদা যাচাই করা উচিত eitherচ্ছিকভাবে কল করা বা মানানসই টাইপটি প্রয়োগ করে কিনা তা পরীক্ষা করে methodচ্ছিক পদ্ধতি প্রয়োগ করা হয়েছে কিনা। আপনি প্রায়শই alচ্ছিক পদ্ধতিতে কল দিলে এটি প্রচুর বয়লারপ্লেটের সাথে পরিচিত হতে পারে।
respondsToSelector
?
optional func doSomething(param: Int?)
সুইফট 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/
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
প্রোটোকলটিকে "@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
এখানে প্রতিনিধি নিদর্শন সহ একটি দৃ 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?()
ইন সুইফট 3.0
@objc protocol CounterDataSource {
@objc optional func increment(forCount count: Int) -> Int
@objc optional var fixedIncrement: Int { get }
}
এটি আপনার সময় সাশ্রয় করবে।
@objc
এখন কোন সদস্যের সমস্ত সদস্যের প্রয়োজন?
required
পতাকা দিয়ে আপনার পদ্ধতিগুলি দিয়ে চেষ্টা করেছি , তবে ত্রুটি সহ: required
কেবলমাত্র 'init' ঘোষণায় ব্যবহার করা যেতে পারে।
optional
প্রতিটি পদ্ধতির আগে আপনাকে কীওয়ার্ড যুক্ত করতে হবে।@objc
কেবল প্রোটোকল হিসাবে নয়, রূপায়ণকারী হিসাবে চিহ্নিত করা উচিত।
আন্তোইনের উত্তরের যান্ত্রিকতাকে চিত্রিত করার জন্য:
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"
আমি মনে করি যে আপনি কীভাবে একটি alচ্ছিক প্রোটোকল পদ্ধতি বাস্তবায়ন করতে পারেন তা জিজ্ঞাসা করার আগে আপনাকে জিজ্ঞাসা করা উচিত কেন আপনার একটি প্রয়োগ করা উচিত।
আমরা যদি ক্লাসিক অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের সুইফট প্রোটোকলকে একটি ইন্টারফেস হিসাবে মনে করি, alচ্ছিক পদ্ধতিগুলি খুব বেশি বোঝায় না এবং সম্ভবত এটির চেয়ে ভাল সমাধান হ'ল ডিফল্ট বাস্তবায়ন তৈরি করা, বা প্রোটোকলের একটি সেটে পৃথক করা (সম্ভবত কিছু উত্তরাধিকারের সম্পর্কের সাথে) তাদের মধ্যে) প্রোটোকল মধ্যে পদ্ধতির সম্ভাব্য সংমিশ্রণ প্রতিনিধিত্ব করতে।
আরও পড়ার জন্য, https://useyourloaf.com/blog/swift-optional-protocol-methods/ দেখুন , যা এই বিষয়ে একটি দুর্দান্ত ধারণা দেয়।
মূল প্রশ্নটি থেকে সামান্য বিষয় ছাড়াই, তবে এটি এন্টোইনের ধারণাটি বন্ধ করে দিয়েছে এবং আমি ভেবেছিলাম এটি কারও সাহায্য করতে পারে।
আপনি প্রোটোকল এক্সটেনশানগুলির সাথে স্ট্রকের জন্য গণিত বৈশিষ্ট্যগুলি 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 রিলিজের মাধ্যমে জিনিসগুলি পরিবর্তিত হলে আমি আপডেট রাখব।
Howচ্ছিক এবং প্রয়োজনীয় প্রতিনিধি পদ্ধতি কীভাবে তৈরি করবেন।
@objc protocol InterViewDelegate:class {
@objc optional func optfunc() // This is optional
func requiredfunc()// This is required
}
কেবলমাত্র সুইফ্ট ক্লাসির জন্য খুব সাধারণ উদাহরণ, এবং কাঠামো বা অঙ্কের জন্য নয়। নোট করুন যে প্রোটোকল পদ্ধতিটি 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!)
?
protocol CollectionOfDataDelegate{ func indexDidChange(index: Int) }
তবে আপনি প্রশ্ন চিহ্ন ছাড়াই এটিকে ডাকতেন: delegate?.indexDidChange(index!)
আপনি যখন কোনও প্রোটোকলে কোনও পদ্ধতির জন্য alচ্ছিক প্রয়োজনীয়তা নির্ধারণ করেন, তখন যে ধরণটি এটি মেনে চলবে সে পদ্ধতিটি প্রয়োগ করতে পারে না , তাই ?
প্রয়োগটি পরীক্ষা করার জন্য ব্যবহৃত হয় এবং যদি কিছুই না থাকে তবে প্রোগ্রামটি ক্রাশ হবে না। @ উনিহিলিগ
weak var delegate : CollectionOfDataDelegate?
(দুর্বল রেফারেন্স নিশ্চিত করুন?)
delegate?
আপনার উত্তরের ব্যবহারের ব্যাখ্যাটি যুক্ত করতে পারেন ? ভবিষ্যতে অন্যদের কাছে সেই তথ্যটি সত্যই অন্তর্ভুক্ত থাকা উচিত। আমি এটি আপভোট করতে চাই, তবে সেই তথ্যটি সত্যই উত্তরে থাকা উচিত।
যদি আপনি বিশুদ্ধ দ্রুতগতি এটা কাজ করতে চান সবচেয়ে ভালো উপায় একটি ডিফল্ট বাস্তবায়ন 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()
}
}
তারপরে আপনি প্রতিটি ফানকে সংজ্ঞায়িত না করে প্রোটোকল প্রয়োগ করতে পারেন
সুইফট প্রোটোকলে আপনি 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চ্ছিক হতে চাই এমন পদ্ধতির জন্য একটি ডিফল্ট বাস্তবায়ন সরবরাহ করতে দেয়।
একটি বিকল্প হ'ল optionচ্ছিক ফাংশন ভেরিয়েবল হিসাবে তাদের সংরক্ষণ করা:
struct MyAwesomeStruct {
var myWonderfulFunction : Optional<(Int) -> Int> = nil
}
let squareCalculator =
MyAwesomeStruct(myWonderfulFunction: { input in return input * input })
let thisShouldBeFour = squareCalculator.myWonderfulFunction!(2)
প্রোটোকলে ফাংশনটি সংজ্ঞায়িত করুন এবং সেই প্রোটোকলের জন্য এক্সটেনশন তৈরি করুন, তারপরে ফাংশনটির জন্য খালি বাস্তবায়ন তৈরি করুন যা আপনি alচ্ছিক হিসাবে ব্যবহার করতে চান।
নির্ধারণ করতে Optional
Protocol
দ্রুতগতি আপনি ব্যবহার করা উচিত @objc
আগে শব্দ Protocol
ঘোষণা এবং attribute
/ method
যে প্রোটোকল ভিতরে ঘোষণা। নীচে একটি প্রোটোকলের ptionচ্ছিক সম্পত্তির নমুনা দেওয়া আছে।
@objc protocol Protocol {
@objc optional var name:String?
}
class MyClass: Protocol {
// No error
}
@optional
পদ্ধতি বা বৈশিষ্ট্যের সামনে রাখুন ।
@optional
এমনকি সঠিক কীওয়ার্ড নয়। এটি optional
, এবং আপনাকে অবশ্যই ক্লাস এবং প্রোটোকল বুদ্ধির গুণাবলীটি ঘোষণা করতে হবে @objc
।