Лучший способ представить тип, возможно, в Objective C без использования указателей (указатель на указатель не является объектом?)

Как лучше всего представить тип «возможно» в Objective C без использования указателей? Я не могу просто использовать указатель на указатель на объект, потому что указатель на указатель на объект не является объектом, и мне нужно, чтобы он был объектом.

Я знаю, что один из способов сделать это - создать собственный класс для каждого объекта, который у меня есть, что приведет к появлению таких классов, как MaybeEmployee, MaybeOrderStatus и многих других настраиваемых классов. Это могло бы сработать, но это кажется неуклюжим и не очень хорошим решением.

Второй способ сделать это, просто иметь класс Maybe, тоже кажется неправильным. Отсутствие безопасности типов просто плохо.


person Molossus Spondee    schedule 09.06.2012    source источник
comment
создания интерфейса и respondsToSelector вызова недостаточно?   -  person Marek Sebera    schedule 10.06.2012
comment
Вы можете просто использовать объект и напрямую получить класс. См .: stackoverflow.com/questions/2055940/   -  person hotpaw2    schedule 10.06.2012
comment
@MarekSebera Я не понимаю, что вы имеете в виду под этим комментарием, вы можете уточнить детали?   -  person Molossus Spondee    schedule 10.06.2012
comment
+[NSNull null] обычно используется для этого. Затем проверьте свои объекты: if((NSNull *)myObject == [NSNull null]) {...}   -  person v1Axvw    schedule 10.06.2012
comment
@ hotpaw2, поэтому вы предлагаете мне просто иметь один тип, возможно, отказаться от статической безопасности типов и вместо этого использовать проверку динамического типа? Я уже упоминал об этой возможности, но это справедливо, если вы думаете, что это правильный путь.   -  person Molossus Spondee    schedule 10.06.2012
comment
@ lef2 Я думаю, что такой подход не работает. Каждый [NSNull null] указывает на один и тот же экземпляр, я хочу сделать что-то вроде [[Maybe alloc] initWithNothing], но с более строгим типом.   -  person Molossus Spondee    schedule 10.06.2012
comment
Забудьте о типах «может быть». Объекты Employee и OrderStatus могут напрямую сообщить вам свой класс. Никаких других предметов не требуется.   -  person hotpaw2    schedule 10.06.2012
comment
@ hotpaw2 Это не имеет смысла. Как мне создать объект «ничего», если бы у меня не был тип «Maybe»? Использование nil не сработает, потому что я не могу преобразовать объект в nil.   -  person Molossus Spondee    schedule 10.06.2012
comment
Объект Employee с нулевым именем сотрудника или номером сотрудника (и т. Д.) Будет относиться к классу Employee.   -  person hotpaw2    schedule 10.06.2012
comment
@ hotpaw2 в основном то, чем я сейчас занимаюсь; однако это не лучшее решение. Я хотел бы сделать одно назначение, чтобы сделать экземпляр nil, например self.contents = nil, но с большей безопасностью типов.   -  person Molossus Spondee    schedule 10.06.2012


Ответы (3)


lef2 имеет правильную идею. Используйте NSNull для представления случая «возможно, нет».

Самый простой способ справиться с этим - заставить ваш метод возвращать объект типа id, но, как вы говорите, это приносит в жертву типобезопасность.

Я бы предложил создать класс-предок MaybeClass и сделать все ваши классы производными от него. Затем вы можете создать конкретный подкласс, который, возможно, не является NSNull.

Обратите внимание, что вы также можете просто использовать стандартные объекты и возвращать nil, если результат вызова метода пуст. Objective C обрабатывает нулевые указатели на объекты гораздо более чисто, чем многие другие языки. Совершенно верно отправлять сообщения объекту nil. Их просто уронили.

person Duncan C    schedule 10.06.2012
comment
Использование nil не является полезной заменой, но MaybeClass звучит многообещающе. - person Gabe; 10.06.2012

Я не совсем уверен, что для вас означает «может быть тип», но есть ли причина, по которой id недостаточно?

person Shaggy Frog    schedule 09.06.2012
comment
Тип Maybe - это параметрически полиморфный тип, который для некоторого типа a является нулевым значением (не нулевым значением) или просто значением. Основная причина, по которой ничто не отличается от null, заключается в том, что можно создать метод setToNothing, метод setToNull не имеет смысла. - person Molossus Spondee; 10.06.2012

Я также не понимаю, что вы подразумеваете под «типом может быть»! Может ли протокол быть тем, что вы хотите, если одни классы реализуют протокол, а другие нет. В них вы можете проверить, реализуют ли объекты это или нет [yourObject corresToProtocol: @protocol (yourProtocol)]. Я надеюсь, что это поможет, но если бы не было дополнительных разъяснений, было бы хорошо.

person Scott Sherwood    schedule 10.06.2012