Implement Swift protocol with get Objective-C attribute

I want to create a common ancestor for all selected views in Swift. I wanted the already existing UIKit classes that implemented the property highlightedto work out of the box, so after reading this answer and checking that the Objective-C getter is defined asisHighlighted . I changed the protocol definition to this:

@objc protocol Highlightable {
    var highlighted: Bool { @objc(isHighlighted) get set }
}

Thus, the implementation of the protocol for UILabeland UIControlis simple:

extension UILabel: Highlightable {}
extension UIControl: Highlightable {}

This works fine, I can access and set the property highlightedfrom Swift instances as Highlightable. However, when I try to implement a protocol on my Swift classes using even the simplest implementation, for example:

class HighlightableView: UIView, Highlightable {
    var highlighted: Bool = false
}

I get this compilation error:

Objective-C 'highlight', getter 'highlight', ('isHighlighted')

- , , .

class HighlightableView: UIView, Highlightable {
    var highlighted: Bool { @objc(isHighlighted) get { return true } set {} }
}

- Xcode 8.0 Swift 3. XCode 8.2, .


- Objective-C Swift. :

@objc protocol Highlightable {
    var _highlighted: Bool { get set }
}

extension UILabel: Highlightable {
    var _highlighted: Bool {
        get { return isHighlighted }
        set { isHighlighted = newValue }
    }
}
extension UIControl: Highlightable {
    var _highlighted: Bool {
        get { return isHighlighted }
        set { isHighlighted = newValue }
    }
}
class HighlightableView: UIView, Highlightable {
    var _highlighted: Bool = false
}
+4
2

UILabel UIControl , highlighted, isHighlighted.

HighlightableView Highlightable, @objc(isHighlighted).

. , highlighted. - private var _highlighted = false.

, , @objc .

protocol Highlightable: class {
    var highlighted: Bool { get set }
}

extension UILabel: Highlightable { }
extension UIControl: Highlightable { }

class HighlightableView: UIView, Highlightable {
    var highlighted = false
}

let label = UILabel()
label.isHighlighted // Prior to iOS 10, this property is called "highlighted"

let view = HighlightableView()
view.highlighted

let highlightables: [Highlightable] = [ label, view ]

for highlightable in highlightables {
    print(highlightable.highlighted)
}

// Prints:
// false
// false

.

:

@objc protocol Highlightable: class {
    var isHighlighted: Bool { @objc(isHighlighted)get @objc(setHighlighted:)set }
}

extension UILabel: Highlightable { }
extension UIControl: Highlightable { }

class HighlightableView: UIView, Highlightable {
    private var _isHighlighted = false
    var isHighlighted: Bool {
        @objc(isHighlighted) get {
            return _isHighlighted
        }
        @objc(setHighlighted:) set {
            _isHighlighted = newValue
        }
    }
}

let label = UILabel()
label.isHighlighted = true

let view = HighlightableView()
view.isHighlighted

let highlightables: [Highlightable] = [ label, view ]

for highlightable in highlightables {
    print(highlightable.isHighlighted)
}

// Prints:
// false
// false

isHighlighted , Highlightable. @objc, , . , @objc , Swift Objective-C.

EDIT:

API iOS 10 Swift ( Xcode 7.2), UILabel UIControl isHighlighted highlighted. IOS SDK 9.3 .

, label.isHighlighted label.highlighted.

, isHighlighted highlighted ( , @objc).

9.3 iOS 10.0 API: https://developer.apple.com/library/content/releasenotes/General/iOS10APIDiffs/index.html

+1

, , , , .

,

protocol Highlightable: class {
    var highlighted: Bool { get set }
}

extension Highlightable where Self: UILabel {
    var highlighted: Bool {
        get {
            return isHighlighted
        }
        set {
            isHighlighted = newValue
        }
    }
}

extension Highlightable where Self: UIControl {
    var highlighted: Bool {
        get {
            return isHighlighted
        }
        set {
            isHighlighted = newValue
        }
    }
}

,

extension UILabel: Highlightable {}
extension UIControl: Highlightable {}

class CustomView: UIView, Highlightable {
    var highlighted: Bool = false
}

, .

0

Source: https://habr.com/ru/post/1663965/


All Articles