支持自定义类swift中的每一个



我是一个objective-c家伙,有时会学习swift,并尝试在我的项目中构建swift类。我正在尝试创建"for each"以自定义类,该类包含一个私有数组。

  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 
}
}

我用这种方式调用objective-c中的代码:

self.feedItemsCollection = [[FeedItemsCollection alloc] initWithFeedItems:entities];
for(FeedItem * feedItem in self.feedItemsCollection)
{
NSLog(@"feedItem-title = %@", feedItem.title);
}

objective-c调用的答案,每个都有swift class,是通过将Array更改为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);
}
}

以及调用每个循环的objective-c代码

self.feedItemsCollection = [[FeedItemsCollection alloc] initWithFeedItems:entities];
for(FeedItem * feedItem in self.feedItemsCollection)
{
NSLog(@"feedItem-title = %@", feedItem.title);
}

根据您需要的功能,您可以实现以下部分或全部协议,所有协议都只转发到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)
}
}

最新更新