Поскольку вы всегда можете создать экземпляр кнопки из раскадровки, эта кнопка должна иметь требуемый init? (Кодировщик aDecoder: NSCoder) . Этот метод необходим только для того, чтобы вы вставили кнопку в раскадровку. Если кнопка действительно создается через раскадровку, то, конечно, у нее не будет достаточно идентификатора (во время инициализации), чтобы она не была необязательной.
Поскольку я предполагаю, что вы всегда будете создавать экземпляр кнопки программно и не через раскадровку, вы можете просто реализовать свой собственный init с вашими параметрами, а затем, в требуемом init, просто вставить fatalError.
Это скомпилируется, когда fatalError возвращает Never (то есть никогда не возвращается). ), поэтому компилятор может понять, что bookId на самом деле никогда не будет равен нулю.
На самом деле, если вы удалите требуемый init, Xcode предложит вам вставить метод с fatalError и автоматически завершит его для вас, если вы захотите.
Конечно, после этого, если вы поместите кнопку этого класса в раскадровку, она обработает sh, так что не делайте этого.
Добавление свойства к кнопке (или просмотр в целом) и принудительно создавать его с помощью некоторого init, а не через раскадровку, в целом, это прекрасно, если вы не собираетесь использовать раскадровку для этой кнопки (или представления).
PS: после этого краткого рассказа о том, как делать то, что вы хотите, я хочу предложить вам НЕ делать этого в этом случае, так как кажется плохой идеей для кнопки хранить какие-либо данные о каком-то API, который вам нужно вызвать , Кнопка должна быть просто кнопкой и информировать вас, когда пользователь нажимает на нее. Затем, когда кнопка нажата, другой класс должен решить, что делать, используя другую модель, чтобы получить соответствующий bookId для нажатия этой кнопки.
Совершенно другое было бы, если бы вы добавили какое-то свойство, которое помогло кнопке чтобы выглядеть иначе или добавить какое-то другое поведение, определяющее c использование кнопки (которая может быть нажата и информировать о нажатиях)