Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Swift

Войти
Регистрация
Восстановить пароль
 
alazir
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 10
#1

Множества (SET) протоколов - Swift

01.12.2015, 10:09. Просмотров 367. Ответов 3
Метки нет (Все метки)

Здравствуйте, уважаемые коллеги!
Если верить создателям, свифт открывает возможности протокол-ориентированного программирования, но на практике выходит, что не все так просто (((

Казалось бы, легко решаемая во всех других языках задача - множество, содержащее протоколы (Set<Pr>). Но протокол Pr должен быть Hashable, а наследовать Hashable протоколом нельзя (его можно только реализовать или использовать в ограничениях).
Кстати, такая такая же проблема возникает, если в Dictionary в качестве ключа указать протокол.

Ну, и, собственно, вопрос. Как можно обойти подобное ограничение?

Заранее спасибо за ответ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2015, 10:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Множества (SET) протоколов (Swift):

Множества Set - C++ Builder
Дали задание - вывести график времени телефонных переговоров нескольких клиентов, в виде прямоугольников. Т.е. нужно создать поле, и 2...

Использование множества set - C++
Задача состоит в следующем: необходимо заполнить массив числами от 1 до 49 случайным образом так, чтобы числа не повторялись. Идея состояла...

Множества set, проверка принадлежности множеству - C++
Доброго времени суток, ув. форумчане :) Для лабораторной работы необходимо реализовать множество и выполнять проверку принадлежности...

Сохранение и загрузка данных множества set - C++
Добрый день. Пишу свое первое приложение, телефонная книга. Использую контейнер для хранения контактов set&lt;Phonebook&gt; Contacts, где ...

Как очистить содержимое множества set? - C++
после добавления множества в вектор нужно очистить множество для повторной записи туда set&lt;string&gt; str; как это сделать с помощью clear()...

Как получить доступ к объектам set-множества? (STL) - C++
Помогите, пожалуйста: запихал в контейнер set объекты класса, а как потом получить доступ к определенному полю объекта в контейнере - не...

3
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
02.12.2015, 01:24 #2
Цитата Сообщение от alazir Посмотреть сообщение
а наследовать Hashable протоколом нельзя
Почему?
0
alazir
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 10
02.12.2015, 09:02  [ТС] #3
AncientPenguin, меня тоже интересует, почему нельзя... Но Вы, наверное, имели в виду, когда проявляется ошибка...

Попробуйте:
protocol Prot: Hashable{
}

class Cls{
var st = Set<Prot>()
}

И в классе увидите ошибку компилятора Swift: "Using Prot as concrete type confirming protocol Hashable not supported"

А ни один тип, НЕ наследуемый от Hashable в Set загнать нельзя ((
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
02.12.2015, 10:10 #4
Во-первых, где вы видели, что это легко решается? в каких языках?
Во-вторых, можете ли вы создать Set<Hashable>? Нет? Я так и думал.
В-третьих, если вы хотите научиться тру протокол-ориентированному программированию, то посмотрите видео об этом с WWDC 2015.

Hashable протокол наследуется от Equatable, который в свою очередь является протоколом с "Self requirement", т.е. он у себя ссылается на Self, что делает дженерик типы которые его используют (вроде Set) - homogeneous а не heterogeneous, что в свою очередь значит, что они (дженерик типы вроде Set) могут работать только с одним и тем же типом. Не просто с любым типом, поддерживающим этот протокол, а только с каким-то одним (либо это будет Int, либо String либо еще что-то, но не как не Int и String вместе).
Т.е. грубо говоря, если вы хотите чтобы Int был Equatable, значит вы должны определить функцию, где левое и правое значение являются типа Int (или Self, т.к. Int: Equatable)
надеюсь так понятно?

т.е., с тех пор как тип Hashable имеет Self requirement, а использующие его дженерики - homogeneous, вам надо объявлять Set с конкретным типом, который имплементирует либо Hashable протокол, либо ваш протокол Pr, который в свою очередь наследуется от Hashable.

Этот пример сработает, т.к. протокол AProto не имеет Self requirement
Objective-C
1
2
3
4
5
6
7
protocol AProto {}
 
class Clazz<AProto> {}
 
protocol BProto: AProto {}
 
let a = Clazz<BProto>()
А вот этот пример выдаст ошибку "Protocol 'YProto' can only be used as a generic constraint because it has Self or associated type requirements" , т.к. у него присутствует Self requirement

Objective-C
1
2
3
4
5
6
7
8
9
protocol XProto {
    func exec(a: Self)
}
 
class Clazz<XProto> {}
 
protocol YProto: XProto {}
 
let a = Clazz<YProto>()
P.S. ссылка на видео https://developer.apple.com/videos/play/wwdc2015-408/
P.P.S. эта тема поднимается на 10:43, но советую все же с начала до конца посмотреть
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2015, 10:10
Привет! Вот еще темы с ответами:

Union(Set set1, Set set2) и intersect(Set set1, Set set2) - Java SE
Напишите методы union(Set set1, Set set2) и intersect(Set set1, Set set2), реализующих операции объединения и пересечения двух множеств....

Ошибка SQL запрос: SET CHARACTER SET 'utf8'; - MySQL
Два года назад на одном из форумов некто задал вопрос (см. ниже), на который так никто и не ответил. У меня сейчас точная копия проблемы....

Чем отличается guid id {get; set;} от int id {get; set;} - C# MVC
Подскажите пожалуйста чем отличается guid id {get; set;} от int id {get; set;}?

Чем отличается private set от set? - C#
Чем отличается private set от set? Зачем это вообще используется?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
02.12.2015, 10:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru