2016-02-02 2 views
0

Я хочу преобразовать базовые классы Xamarin.iOS в native, чтобы я мог также разрабатывать native, когда проект должен выполняться только в iOS.Преобразование Xamarin.iOS кода в родной?

Теперь у меня есть абстрактные классы, наследующие от UICollectionViewSource, и я действительно не знаю, как я могу поместить это в Swift, так как он ориентирован на протокол. Я мог бы пойти «абстрактным» способом и бросить fatalerror, когда свойство или метод нужно переопределить.

Или я мог бы пойти по протоколу, и у меня есть UICollectionViewSource subclass протокол, который приведет к более приятному завершению кода, и вы не забудете ничего реализовать.

ответ

1

Я считаю, что ближайшая вещь будет с протоколом и расширениями. Таким образом, вы можете предоставить стандартные реализации для методов, которые имеют один.

protocol MyCollection : UICollectionViewDataSource { 
    func foo() -> Double 
    func fooAbstract() -> Double 
} 

// provide default implementations 
extension MyCollection { 
    func foo() -> Double{ 
     return Double.infinity; 
    } 
} 

// requires missing methods to be implemented 
class NewCollection : MyCollection { 
    ... 
} 

РЕДАКТИРОВАТЬ, чтобы ответить на ваш вопрос. Я не 100%, если это то, что вы имеете в виду, но мне не трудно вызвать «виртуальные» методы из расширения. Вот пример с использованием чего-то другого, кроме источника UICollection (слишком много методов для реализации :)).

protocol MyTwo{ 
     func fooA2() -> Bool 
} 

protocol MyCollection : MyTwo { 
    func foo() -> Double 
    func fooAbstract() -> Double 
} 

// provide default implementations 
extension MyCollection { 
    func foo() -> Double{ 
     if fooA2() { 
      return Double.infinity; 

     } 

     return 0; 
    } 
} 

class NewCollection : MyCollection { 
    func fooAbstract() -> Double{ 
     return foo(); 
    } 

    func fooA2() -> Bool { 
     return true; 
    } 
} 
+0

Расширение не может использовать методы и свойства, определенные в протоколе (так в вашем примере: в 'расширением MyCollection', внутри тела' Foo() 'Я не могу использовать' fooAbstract() '). Это ошибка, или я делаю что-то неправильно? – vrwim

+0

Отредактирован образец. Мне удалось вызвать методы как по базовому протоколу, так и по производному протоколу внутри расширения. – SKall

Смежные вопросы