ব্লক-ভিত্তিক এপিআই পদ্ধতিতে কীভাবে নননল এবং ননীয় ওজেক্টিভ-সি কীওয়ার্ড ব্যবহার করবেন


105

নিম্নলিখিত পদ্ধতিটি বিবেচনা করুন

- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;

নতুন nonnullএবং nullable টীকাগুলির কীওয়ার্ডগুলির সাহায্যে আমরা এটি নীচে সমৃদ্ধ করতে পারি:

- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;

তবে আমরা এই সতর্কতাটিও পেয়েছি:

পয়েন্টারটি একটি অযোগ্যতা ধরণের স্পেসিফায়ার (__nnull বা __nullable) অনুপস্থিত

এটি তৃতীয় প্যারামিটার (ব্লক এক) বোঝায়।

ডকুমেন্টেশন ব্লক প্যারামিটার nullability নির্দিষ্ট করতে কিভাবে উদাহরণ কাভার করে না। এটি ভারব্যাটিকাম বলে

আপনি খালি প্যারেনসেসিসের অবিলম্বে অ-আন্ডারকর্ডেড ফর্মগুলি nullable এবং nonnull ব্যবহার করতে পারবেন, যতক্ষণ না টাইপটি কোনও সাধারণ অবজেক্ট বা ব্লক পয়েন্টার।

আমি কোনও ভাগ্য ছাড়াই ব্লকের (যে কোনও অবস্থাতে) দুটি কীওয়ার্ডের একটি রাখার চেষ্টা করেছি। আন্ডারস্কোর প্রিফিক্সড ভেরিয়েন্টগুলি ( __nonnullএবং __nullable) চেষ্টা করে দেখুন ।

সুতরাং আমার প্রশ্ন হ'ল: আমি কীভাবে ব্লক পরামিতিগুলির জন্য nlalability শব্দার্থবিজ্ঞান নির্দিষ্ট করতে পারি?

উত্তর:


128

এটি কাজ করছে বলে মনে হচ্ছে

- (void)methodWithArg:(nonnull NSString *)arg1 
  andArg:(nullable NSString *)arg2 completionHandler:(nullable void (^)
  (NSArray * _Nullable results, NSError * _Nonnull error))completionHandler

ব্লক এবং এর পরামিতিগুলির জন্য আপনাকে দুর্বলতা নির্দিষ্ট করতে হবে ...

সম্পাদনা: আরও তথ্যের জন্য, সুইফ্ট ব্লগ দেখুন


এই NSError **টাইপটি কীভাবে কাজ করে ? সংকলকটিকে আমি খুশি মনে করতে পারি না।
দুহানেবেল

3
The particular type NSError ** is so often used to return errors via method parameters that it is always assumed to be a nullable pointer to a nullable NSError reference.
সুইফ্ট

@duhanebel উত্তর দেওয়া হয় stackoverflow.com/questions/33198597/... : (NSError * _Nullable * _Nullable) ত্রুটি
এলিস ভ্যান Looij

33

অ্যাপল ব্লগের মতে ("নুলাব্যতা এবং উদ্দেশ্য-সি") , আপনি ব্যবহার করতে পারেন

NS_ASSUME_NONNULL_BEGINএবং NS_ASSUME_NONNULL_END

এই অঞ্চলগুলির মধ্যে, কোনও সাধারণ পয়েন্টার প্রকারটি ধরে নেওয়া হবে nonnull। তারপরে আপনি কেবল nullableযুক্তযোগ্য বস্তুর জন্য যুক্ত করতে পারেন , যা পছন্দ করে

NS_ASSUME_NONNULL_BEGIN

@interface MyClass: NSObject

- (void)methodWithArg:(NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;

@end

NS_ASSUME_NONNULL_END
  • যদি ত্রুটি হয় NSError **ধরন, হওয়া উচিতNSError * _Nullable * _Nullable
  • যদি বস্তুটি id *টাইপ হয়, আরও ভাল ব্যবহার হয় তবে id _Nullable * _Nonnullএটি নির্ভর করে (আপনি কোনও _Nullable id * _Nullableপ্রকার চান )।
  • যদি অবজেক্টটি NSObject *টাইপ করা থাকে তবে আপনাকে পয়েন্টারের পরে এনেটেশন লাগাতে হবেNSObject * _Nullable * _Nonnull

বিঃদ্রঃ

_Nonnullএবং _Nullableপয়েন্টারের পরে ব্যবহার করা উচিত বা id(অ্যাপল উদাহরণ কোডে করে AAPLListItem * _Nullable) তবে অ-আন্ডারস্কোরড ফর্মগুলি nonnullএবং nullableএকটি খোলা বন্ধনী পরে ব্যবহার করা যেতে পারে।

তবে সাধারণ ক্ষেত্রে এই টীকাগুলি লেখার জন্য খুব সুন্দর উপায় রয়েছে: পদ্ধতি ঘোষণার মধ্যে আপনি নন-আন্ডারর্ডার্ড ফর্মগুলি ব্যবহার করতে পারেন nullableএবং nonnullঅবিলম্বে একটি খোলা বন্ধনী পরে, যতক্ষণ না টাইপটি কোনও সাধারণ অবজেক্ট বা ব্লক পয়েন্টার।

"নুলিয়াযোগ্যতা এবং উদ্দেশ্য-সি" এ আরও পরীক্ষা করুন

সুরক্ষার জন্য, এই নিয়মের কয়েকটি ব্যতিক্রম রয়েছে:

  • typedefপ্রকারভেদে সাধারণত অন্তর্নিহিত নালিয়াযোগ্যতা থাকে না — এগুলি প্রসঙ্গের উপর নির্ভর করে সহজেই হয় নমনীয় বা অ-ঘনযোগ্য can অতএব, নিরীক্ষিত অঞ্চলগুলিতে এমনকি typedefপ্রকারগুলি ধরা হয় না nonnull
  • আরও জটিল পয়েন্টার জাতীয় id *ধরণগুলি অবশ্যই স্পষ্টভাবে টীকায়িত করতে হবে। উদাহরণস্বরূপ, একটি nullaable অবজেক্ট রেফারেন্স একটি নন-nullable পয়েন্টার নির্দিষ্ট করতে, ব্যবহার _Nullable id * _Nonnull
  • নির্দিষ্ট ধরণেরটি NSError **প্রায়শই পদ্ধতি প্যারামিটারগুলির মাধ্যমে ত্রুটিগুলি ফেরত দেওয়ার জন্য ব্যবহৃত হয় যে এটি সর্বদা একটি naclable NSErrorরেফারেন্সের জন্য একটি nullable পয়েন্টার হিসাবে ধরে নেওয়া হয় ।

_Nullable id * _Nonnullবিভ্রান্ত করা যাবে না, id _Nullable * _Nonnullভাল করে বুঝতে হয়।

_Nonnullএবং _Nullableপয়েন্টার পরে ব্যবহার করা উচিত বা id(অ্যাপল উদাহরণ কোডে করেAAPLListItem * _Nullable )


দুর্বল সম্পত্তির জন্য, _নুলযোগ্য প্রয়োগ করা হয়েছে।
দংজিন সুহ 13:38

3

আপনি এটির মতোও করতে পারেন:

- (id __nullable)methodWithArg:(NSString * __nullable)arg1
                        andArg:(NSString * __nonnull)arg2
             completionHandler:(void (^ __nonnull)(NSArray * __nonnull results, NSError * __nullable error))completionHandler;

এটি কেবল নির্ভর করে যে আপনি কোন সিনট্যাক্সটি বেশি পছন্দ করেন।


2

শিরোনাম ফাইলটিতে সম্পূর্ণতা সংজ্ঞায়িত করতে আমি এটি করেছি

typedef void (^PublicEventsHandler) (BOOL success, NSArray * _Nullable publicEvents);

অবশ্যই, আমি গৃহীত উত্তরের সাথে একমত।


0

অ্যাপল বিকাশকারী ব্লগ থেকে : দ্য কোর: _নুলযোগ্য এবং _ননুল

আপনি খালি প্যারেনসেসিসের অবিলম্বে অ-আন্ডারকর্ডেড ফর্মগুলি nullable এবং nonnull ব্যবহার করতে পারবেন , যতক্ষণ না টাইপটি কোনও সাধারণ অবজেক্ট বা ব্লক পয়েন্টার।

অ-আন্ডারকর্ডেড ফর্মগুলি আন্ডারকর্ডেড ফর্মগুলির চেয়ে সুন্দর, তবে আপনাকে এখনও এটি আপনার শিরোনামের প্রতিটি ধরণের প্রয়োগ করতে হবে


হ্যাঁ তবে অ-আন্ডারস্কোর (আরও ভাল) ব্লক ঘোষণায় কাজ করে না
পল ব্রুনিউ

-2

এনএসইরর ** মামলার জন্য আমি যা ব্যবহার করেছি তা এখানে:

-(BOOL) something:(int)number withError:(NSError *__autoreleasing  __nullable * __nullable)error;

1
যেমন অ্যাপল বলেছে, এর জন্য NSError **আপনার এর ন্যূনযোগ্যতা নির্দিষ্ট করার দরকার নেই।
ডনসং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.