Por que a tag @objc é necessária para usar um seletor?

Estou tentando usar um seletor para ver se um determinado protocolo pode executar uma ação. Quando eu tento assim:

protocol Test {
    func hello()
    func goodBye(a: String)
}

class Tester: NSObject, Test {        
    override init() {}
    func hello() { }        
    func goodBye(a: String) { }
}

let a: Test = Tester()

let result = a.responds(to: Selector("goodByeWithA:"))

Nesse caso,result avalia parafalse.

Mas se eu adicionar o@objc ao protocolo, ele avalia comotrue.

@objc protocol Test {
    func hello()
    func goodBye(a: String)
}

Por que é isso

Em uma nota lateral, eu sei que agora é recomendável usar o#selectorintaxe e para me afastar do uso de strings, mas por várias razões, eu tenho que usar uma string nesse cas

EDIT: Isso só começou a acontecer depois que eu migrei meu projeto para o Swift 4.2

questionAnswers(1)

yourAnswerToTheQuestion