Это перечисление с побитовыми значениями или битовыми флагами. Каждое значение является двоичным значением, в котором только один бит установлен в 1, а все остальные установлены в 0. Таким образом, вы можете сохранить в значении столько флагов, сколько битов имеет целое число.
Оператор сдвига влево «<<» - это смещение битов влево или на самую старшую сторону двоичного числа. Это то же самое, что вычисление операции "* 2" (умноженное на два). </p>
Например, в перечислении, которое вы отправили в своем вопросе, первое значение, UIDataDetectorTypePhoneNumber, равно 1. Второе, UIDataDetectorTypeLink, равно 2, а третье, UIDataDetectorTypeAddress, равно 4.
Вы комбинируете эти значения как флаги, чтобы установить несколько разных битов в одно и то же целое число:
NSInteger fooIntValue = UIDataDetectorTypePhoneNumber | UIDataDetectorTypeLink;
как '|' операция является побитовой, результатом будет двоичное значение ... 0011, то есть 3. И вы указываете, что ваша переменная fooIntValue имеет два флага, установленных в true для двух разных свойств.