2014-09-19 10 views
11

के बजाय अपरिवर्तनीय एनएसएआरएआर में परिवर्तित कर दिया गया है एक साधारण स्विफ्ट क्लास में var Array का एक क्षेत्र है। वर्ग ऑब्जेक्टिव-सी करने के लिए अनुकूलित किया जाता है तो फ़ील्ड प्रकार NSArray (अपरिवर्तनीय), जबकि यह NSMutableArray (परिवर्तनशील) होना चाहिएप्रकार के स्विफ्ट क्लास फ़ील्ड var Array को NSMutableArray

class Categoryy: NSObject { 

    var items = Array<Item>() 

}

Categoryy तेज वर्ग Xcode-उत्पन्न शीर्षक में ऑब्जेक्टिव-सी करने के लिए अनुकूलित किया गया है के रूप में सामने आ रहा है निम्नलिखित के रूप में MODULE_NAME-swift.h फ़ाइल:

SWIFT_CLASS("_TtC8waiterio9Categoryy") 
@interface Categoryy : NSObject 
@property (nonatomic, copy) NSArray * items; 
- (instancetype)init OBJC_DESIGNATED_INITIALIZER; 
@end

वहाँ वर मदों के लिए एक तरीका है: सरणी क्षेत्र ऑब्जेक्टिव-सी में एक परिवर्तनशील NSMutableArray के लिए परिवर्तित किया?

+0

आप NSMutableArray के हैडर बदलने में सक्षम नहीं कर रहे हैं? – erdekhayser

+0

यह एक व्यवहार्य समाधान नहीं है :(स्विफ्ट के लिए एक्सकोड-जेनरेटेड हेडर मॉड्यूल-स्विफ्टएच नामक है और हर बार एक्सकोड द्वारा पुन: निर्मित किया जाता है, प्रत्येक बार स्विफ्ट फाइलों में से एक फ़ील्ड या विधि हस्ताक्षर बदलता है। आप मैन्युअल रूप से प्रकार बदल सकते हैं NSArray से NSMutableArray के फ़ील्ड, लेकिन जैसे ही आप एक स्विफ्ट फ़ाइल के फ़ील्ड या विधियों के हस्ताक्षर को बदलते हैं, आपके सभी परिवर्तन गुम हो जाते हैं। – Giorgio

+0

क्या आपने इस पर एक रडार दर्ज किया था? –

उत्तर

6

ऐसा इसलिए है क्योंकि items संपत्ति वास्तव में अपरिवर्तनीय है।

As you know, स्विफ्ट में Array की struct आधारित कार्यान्वयन की प्रकृति की वजह से है, तो निम्न कोड cat.items प्रभावित नहीं करता।

let cat = Categoryy() 

var _items = cat.items 
_items.append(item) 

इसके बजाय, आप इस

cat.items.append(item) 

दूसरी ओर की तरह कॉल करने के लिए ऑब्जेक्टिव-सी में, है, [cat.items addObject:item] निम्नलिखित के रूप में बिल्कुल वैसा ही है:

id _items = [cat items]; 
[_items addObject:item]; 

कि बहुत समान है गैर-काम करने वाले स्विफ्ट कोड के लिए।

दुख कहने के लिए, उद्देश्य-सी में स्विफ्ट में cat.items.append(item) के रूप में समकक्ष संपत्ति/विधि को अर्थशास्त्र कॉल करने की विधि नहीं है।

इस के समान है:

// Objective-C 
CGRect frame = view.frame; 
view.frame = CGRectMake(frame.origin.x, 50, frame.size.width, frame.size.height) 

// Swift 
view.frame.origin.y = 50 

-

हो सकता है कि एप्पल लागू कर सकते हैं NSMutableArray (या निजी उपवर्ग) के रूप में, बेशक आप उस अनुरोध कर सकते हैं। मुझे संदेह है कि ऐप्पल ऐसा करेगा, क्योंकि जेनिक्स द्वारा समय-समय पर सुरक्षा संकलित करता है।

वैसे भी, मुझे लगता है, आप Categoryy इस तरह लागू करना चाहिए:

class Categoryy: NSObject { 
    var items:[Item] = [] 

    func addItem(item:Item) { 
     items.append(item) 
    } 

    func setItem(item:Item, atIndex:Int) { 
     items[atIndex] = item; 
    } 

    // and so on .. 
} 
1

आप एक NSMutableArray चाहते हैं, सबसे आसान तरीका है बस स्विफ्ट में एक NSMutableArray उपयोग करने के लिए है। Array<T> दोनों (एक अपरिवर्तनीय) NSArray और NSMutableArray एक ही समय में व्यवहार नहीं करते हैं (और नहीं कर सकते) - अभी यह एक अपरिवर्तनीय NSArray के रूप में व्यवहार करता है। स्विफ्ट से NSArray के अनुरूप NSMutableArray के अनुरूप एक अंतर्निहित कक्षा प्रकार का उपयोग कर सकता है।

एक और विकल्प NSMutableArrayNSMutableArray तक पहुंचने के लिए @objc के साथ NSMutableArray के साथ स्विफ्ट क्लास को लपेटने का एक और विकल्प है। यह आपको T पर वस्तुओं को बाधित करने के लिए जेनेरिक का उपयोग करने देता है।

0

एक कामकाज के रूप में, आप स्विफ्ट सरणी में सीधे उद्देश्य-सी में स्विफ्ट सरणी तक पहुंचने के बजाय स्विफ्ट फ़ाइल में append पर कॉल कर सकते हैं।

स्विफ्ट:

func addItem(item:Item) 
{ 
    items.append(item) 
} 

ऑब्जेक्टिव-सी:

[yourSwiftObject addItem:item]; 
संबंधित मुद्दे