2016-05-12 3 views
2

У меня есть этот код в Objective C (это экстракт исходного кода Apple, AdvancedCollectionView)Casting Объект/ObjectiveC от Swift

@interface AAPLCollectionViewWrapper : NSObject 

+ (UIView *)wrapperForCollectionView:(UICollectionView *)collectionView mapping:(AAPLDataSourceMapping *)mapping 
{ 
    if (!collectionView) 
    return nil; 

    BOOL measuring = NO; 

    if ([collectionView isKindOfClass:[AAPLCollectionViewWrapper class]]) 
    measuring = ((AAPLCollectionViewWrapper *)collectionView).measuring; 

    return (UIView *)[[AAPLCollectionViewWrapper alloc] initWithCollectionView:collectionView mapping:mapping measuring:measuring]; 
} 

Я стараюсь, чтобы перевести его в быстры, но у меня есть проблема с этой линии:

return (UIView *)[[AAPLCollectionViewWrapper alloc] initWithCollectionView:collectionView mapping:mapping measuring:measuring]; 

В Swift

return (CollectionViewWrapper(collectionView: collectionView, mapping: mapping, measuring: measuring) as! UIView 

у меня есть эта ошибка отлиты из «Коллекции ViewWrapper 'для несвязанного типа «UIView» всегда сбой

Что случилось? Как я могу конвертировать APPLCollectionViewWrapper в UIView?

ОБНОВЛЕНО

Я думаю, что мне нужно использовать полиморфизм, в оригинальном исходном коде, я нашел этот комментарий:

/// An object that pretends to be either a UITableView 
/// or UICollectionView that handles transparently mapping from local to global index paths 
@interface AAPLCollectionViewWrapper : NSObject 

Таким образом, в исходном коде, AAPLCollectionViewWrapper является NSObject, функция wrapperForCollectionView возвращает UIView, то он приводится к UICollectionView

.h

/// An object that pretends to be either a UITableView or UICollectionView that handles transparently mapping from local to global index paths 
@interface AAPLCollectionViewWrapper : NSObject 

/// Factory method that will determine whether the wrapper is measuring based on the collection view. If the collectionView is actually an instance of AAPLCollectionViewWrapper, the value will be pulled from the collectionView. Otherwise, the default is NO. 
+ (__kindof UIView *)wrapperForCollectionView:(UICollectionView *)collectionView mapping:(nullable AAPLDataSourceMapping *)mapping; 

+ (__kindof UIView *)wrapperForCollectionView:(UICollectionView *)collectionView mapping:(nullable AAPLDataSourceMapping *)mapping measuring:(BOOL)measuring; 

@property (nonatomic, strong, readonly) UICollectionView *collectionView; 
@property (nullable, nonatomic, strong, readonly) AAPLDataSourceMapping *mapping; 

@property (nonatomic, readonly) BOOL measuring; 

@end 

Как я могу сделать то же самое в быстром?

+1

Я мало знаю о 'AdvancedCollectionView'. Но я думаю, что если это «CollectionViewWrapper», должен быть способ получить то, что он обертывает. Попытайтесь найти это свойство/метод, который разворачивает оболочку. Затем вы получите «CollectionView». Затем вы можете напрямую вернуть этот «CollectionView», не нужно бросать! – Sweeper

+0

Напишите класс CollectionViewWrapper в быстром –

ответ

0

Я бы рекомендовал рассмотреть модель «трубы», так что ваша обертка должна быть UICollectionView сама - необходимо вывести из UICollectionView:

@interface AAPLCollectionViewWrapper : UICollectionView 
//... 

+ (UICollectionView *)wrapperForCollectionView:(UICollectionView *)collectionView mapping:(AAPLDataSourceMapping *)mapping 
//... 
0

В ролях из «CollectionViewWrapper» к неродственной типа «UIView 'всегда не работает

Компилятор говорит, что он всегда будет терпеть неудачу, но не во время выполнения. Если это действительно что-то вроде UIView, это не провалится во время выполнения. И AAPLCollectionViewWrapper - это выражение Objective-C, возможно, расширение UICollectionView будет элегантным.