поддержка каждого в пользовательском классе Swift - PullRequest
0 голосов
/ 08 мая 2020

Я объективный - c парень, который иногда учится быстро и пытается создавать быстрые классы в своих проектах. Я пытаюсь создать индивидуальный класс «для каждого», содержащий частный массив.

  1. Нужно ли мне создавать итератор? Если да, мне нужно сделать это переменной класса и какой это тип?
  2. Любой пример кода или справка в этом коде будут хороши.
import Foundation  
@objcMembers class FeedItemsCollection:NSObject,Sequence, IteratorProtocol {   
    private var feedItems:[FeedItem]  
    private var feedsIterator = //stuck  
    public init(feedItems : [FeedItem])
    {
        self.feedItems = feedItems
    }

    func add(feedItems: [FeedItem]) {
        self.feedItems.append(contentsOf: feedItems)
    }

    func add(feedItems: [FeedItem], at:Int) {
        self.feedItems.insert(contentsOf: feedItems, at: at)
    }

    func next() -> FeedItem? {        
        return feedsIterator.next ////stuck 
    }
}

Я называю код от объектива- c таким образом:

self.feedItemsCollection = [[FeedItemsCollection alloc] initWithFeedItems:entities];

    for(FeedItem * feedItem in self.feedItemsCollection)
    {
        NSLog(@"feedItem-title = %@", feedItem.title);
    }

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Ответ на вызов из objective- c с для каждого на swift class , путем изменения массива в NSArray и реализовать NSFastEnumeration.

@objcMembers public class FeedItemsCollection:NSObject,NSFastEnumeration,Sequence
{
    //private var feedItems:[FeedItem]
    private var feedItems:NSMutableArray

    public init(feedItems :NSMutableArray)
      {
          self.feedItems = feedItems
      }
    public func makeIterator() ->NSFastEnumerationIterator
    {
        return NSFastEnumerationIterator(self)
    }
    public func countByEnumerating(with state: UnsafeMutablePointer<NSFastEnumerationState>, objects buffer: AutoreleasingUnsafeMutablePointer<AnyObject?>, count len: Int) -> Int {

        return self.feedItems.countByEnumerating(with: state, objects: buffer, count: len);
    }

}

и код target- c, который вызывает для каждого l oop

   self.feedItemsCollection = [[FeedItemsCollection alloc] initWithFeedItems:entities];

    for(FeedItem * feedItem in self.feedItemsCollection)
    {
        NSLog(@"feedItem-title = %@", feedItem.title);
    }
0 голосов
/ 08 мая 2020

В зависимости от того, какие функции вам нужны, вы можете реализовать некоторые или все протоколы ниже, все просто перенаправляя на feedItems:

import Foundation

struct FeedItem {}

@objcMembers class FeedItemsCollection: NSObject {
    private var feedItems:[FeedItem]

    override init() {
        self.feedItems = []
    }
}

extension FeedItemsCollection: Sequence {
    func makeIterator() -> Array<FeedItem>.Iterator {
        return feedItems.makeIterator()
    }
}

extension FeedItemsCollection: Collection {
    typealias Index = Int

    var startIndex: Index { feedItems.startIndex }
    var endIndex: Index { feedItems.endIndex }

    func index(after i: Index) -> Index { self.feedItems.index(after: i) }

    subscript(_ i: Index) -> FeedItem {
        get { self.feedItems[i] }
        set { self.feedItems[i] = newValue }
    }
}

extension FeedItemsCollection: BidirectionalCollection {
    func index(before i: Index) -> Index { self.feedItems.index(before: i) }
}

extension FeedItemsCollection: RandomAccessCollection {}

extension FeedItemsCollection {
    // Not strictly necessary, but IIRC it improves indexing performance.

    func index(_ index: Index, offsetBy offset: Int) -> Index {
        self.feedItems.index(index, offsetBy: offset)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...