Binary operator '|=' cannot be applied to two 'UIAccessibilityTraits' operands

Viewed 3980

I just updated to xCode 10 and instantly got this error "Binary operator '|=' cannot be applied to two 'UIAccessibilityTraits' operands" The error appears in the 4th line of code:

func setAccessibilityView() {
    self.addSubview(accessibilityView)
    accessibilityView.isAccessibilityElement = true
    accessibilityView.accessibilityTraits |= UIAccessibilityTraits.button
}
4 Answers

These are not Objective-C bitmasks. accessibilityTraits is of type UIAccessibilityTraits which conforms to OptionSet which in turn conforms to SetAlgebra.

To add a value to the existing values, replace:

accessibilityView.accessibilityTraits |= UIAccessibilityTraits.button

with:

accessibilityView.accessibilityTraits.insert(.button)

If you wanted to add multiple values, you can do:

accessibilityView.accessibilityTraits.formUnion([.button, .selected])

If you want to set the traits to a specific set, then do:

accessibilityView.accessibilityTraits = [.button, .selected] // whatever options you need

To remove a value, use:

accessibilityView.accessibilityTraits.remove(.button)

|= is the "bitwise-OR and assign operator", applicable to binary integer types only. In Objective-C accessibilityTraits is a bitmask. In Swift it has been updated to an OptionSet with a nicer syntax:

accessibilityView.accessibilityTraits.insert(.button)

In the short term if you have a lot of code to migrate you can use operator overloading to reimplement the missing operators:

#if swift(>=4.2)
    public extension UIAccessibilityTraits {
        public static func |= (left: inout UIAccessibilityTraits, right: inout UIAccessibilityTraits) {
            left = left | right
        }

        public static func | (left: UIAccessibilityTraits, right: UIAccessibilityTraits) -> UIAccessibilityTraits {
            return UIAccessibilityTraits(rawValue: left.rawValue | right.rawValue)
        }

        public static prefix func ~ (trait: UIAccessibilityTraits) -> UIAccessibilityTraits {
            return UIAccessibilityTraits(rawValue: ~trait.rawValue)
        }
    }
#endif

|= is the bitwise-OR and assign operator", applicable to binary integer types only. In Objective-C accessibilityTraits is a bitmask.

In swift 4.2 you can use like below:

accessibilityTraits = UIAccessibilityTraits(rawValue: accessibilityTraits.rawValue | UIAccessibilityTraits.button.rawValue)
Related