2015-09-12 8 views
49

याद आ रही है Xcode 7 जीएम में मैं इस चेतावनी पाने के लिए शुरू कर दिया:सूचक एक nullability प्रकार निर्दिष्टकर्ता

सूचक एक nullability प्रकार निर्दिष्टकर्ता (_Nonnull, _Nullable, या _Null_unspecified)

याद आ रही है में निम्नलिखित समारोह घोषणा (NSUserDefaults विस्तार)

- (void)setObject:(nullable id)value 
      forKey:(NSString *)defaultName 
    objectChanged:(void(^)(NSUserDefaults *userDefaults, id value))changeHandler 
    objectRamains:(void(^)(NSUserDefaults *userDefaults, id value))remainHandler; 

क्यों यह चेतावनी दिखा रहा है और मैं इसे कैसे ठीक करना चाहिए?

उत्तर

48

आप संचालकों/ब्लॉक

- (void)setObject:(nullable id)value 
      forKey:(nonnull NSString *)defaultName 
    objectChanged:(nullable void(^)(NSUserDefaults *userDefaults, id value))changeHandler 
    objectRamains:(nullable void(^)(NSUserDefaults *userDefaults, id value))remainHandler; 

क्यों के लिए भी nullable निर्दिष्ट करने की आवश्यकता? यह स्विफ्ट के कारण है। स्विफ्ट वैकल्पिक पैरामीटर (?) की अनुमति देता है, जो उद्देश्य-सी नहीं करता है। यह उन पैरामीटरों को जानने के लिए स्विफ्ट कंपाइलर के लिए दोनों के बीच एक पुल के रूप में किया जाता है। एक 'नॉननल' स्विफ्ट कंपाइलर को बताएगा कि तर्क आवश्यक है। एक नल वैकल्पिक

अधिक जानकारी के लिए यह है कि पढ़ें: https://developer.apple.com/swift/blog/?id=25

+0

मुझे यह जोड़ना होगा कि संकलक ब्लॉक पैरामीटर के लिए कुछ निर्दिष्ट करने के लिए भी अंक हैं। – kelin

+38

क्यों ????????????????? – mskw

+1

क्या आप पूछ रहे हैं कि आपको उन्हें निर्दिष्ट करने की आवश्यकता क्यों है? स्विफ्ट कंपाइलर के साथ अंतःक्रियाशीलता के कारण। यह निर्धारित करता है कि एपीआई को वैकल्पिक के रूप में उजागर किया गया है या नहीं। यहां ऐप्पल ब्लॉग पोस्ट देखें: https://developer.apple.com/swift/blog/?id=25 – bandejapaisa

13

सही, काम कर रहे विधि घोषणा, संकलक द्वारा स्वीकार किए जाते हैं:

- (void)setObject:(nullable id)value 
      forKey:(nonnull NSString *)defaultName 
    objectChanged:(nullable void(^)(NSUserDefaults *_Nonnull userDefaults, id _Nullable value))changeHandler 
    objectRamains:(nullable void(^)(NSUserDefaults *_Nonnull userDefaults, id _Nullable value))remainHandler; 
42

आप घोषणाओं के ब्लॉक के संबंध में निम्न मैक्रो का उपयोग कर सकते हैं (कार्य और चर) उद्देश्य सी शीर्षलेखों में:

NS_ASSUME_NONNULL_BEGIN 

NS_ASSUME_NONNULL_END 

आपको इसके लिए निरर्थक एनोटेशन जोड़ने की आवश्यकता है संदर्भ जो उस ब्लॉक के भीतर शून्य हो सकते हैं। यह दोनों फ़ंक्शन पैरामीटर और परिवर्तनीय घोषणाओं पर लागू होता है।

में के रूप में:

@interface SMLBaseUserDetailsVC : UIViewController < UICollectionViewDelegate> 
NS_ASSUME_NONNULL_BEGIN 

@property (nonatomic, readonly) IBOutlet UIScrollView *detailsScrollView; 
@property (nonatomic, readonly) IBOutlet UICollectionView *photoCV; 
@property (nonatomic, weak, readonly) SMLUser *user; 
- (IBAction)flagUser:(id)sender; 
- (IBAction)closeAction:(nullable id)sender; 
- (void) prefetchPhotos; 

NS_ASSUME_NONNULL_END 

@end 

संपादित करें * इस क्यों ??? ऐसा इसलिए है क्योंकि एक उद्देश्य-सी वर्ग के लिए तेजी से अंतःक्रियाशील होने के लिए, आपको शून्यता घोषित करने की आवश्यकता है ताकि संकलक गुणों को तेजी से विकल्प के रूप में जान सकें या नहीं। निरर्थक उद्देश्य सी गुणों को तेजी से विकल्प के रूप में जाना जाता है और गुणों के लिए निरर्थक घोषणाकर्ताओं के संयोजन के साथ इन मैक्रोज़ का उपयोग करके संकलक को वैकल्पिक विकल्प के रूप में व्यवहार करने की अनुमति मिलती है (वैकल्पिक मोनैड होते हैं - एक ऑब्जेक्ट जो ऑब्जेक्ट या शून्य को लपेटता है)।

+0

फिर, मुझे लगता है कि आपको समझाया जाना चाहिए कि आपको घोषणा के ब्लॉक्स के आसपास मैक्रोज़ का उपयोग क्यों करना है ??? –

8

मैं यह जवाब देने के लिए उत्तर देता हूं कि _Nonnull या nullable क्यों जोड़ना चाहिए।

इस ब्लॉग के अनुसार: https://developer.apple.com/swift/blog/?id=25

स्विफ्ट के बारे में महान चीज़ों में से एक यह है कि यह पारदर्शी रूप से ऑब्जेक्टिव-सी कोड, ऑब्जेक्टिव-सी में लिखा दोनों मौजूदा चौखटे और अपने एप्लिकेशन में कोड के साथ interoperates है। हालांकि, स्विफ्ट में वैकल्पिक और गैर-वैकल्पिक संदर्भों के बीच एक मजबूत भेद है, उदा। NSView बनाम NSView?, जबकि उद्देश्य-सी इन दो प्रकारों में से दोनों को NSView * के रूप में दर्शाता है। चूंकि स्विफ्ट कंपाइलर यह सुनिश्चित नहीं कर सकता है कि कोई विशेष NSView * वैकल्पिक है या नहीं, इस प्रकार को स्विफ्ट में एक स्पष्ट रूप से अनचाहे वैकल्पिक, NSView! के रूप में लाया गया है।

यह सब स्विफ्ट के लिए है।

संबंधित मुद्दे