在 Swift 中按协议查找

Find by Protocol in Swift

如何在 Swift 中将协议作为参数传递?

在 Objective-C 我可以这样做:

id <CurrentUserContex> userContex = [ServiceLocator locate:@protocol(CurrentUserContex)];

服务定位器:

+ (id)locate:(id)objectType 

编辑

Qbyte 回答后尝试使用:

ServiceLocator.locate(CurrentUserContex.self)

但我收到 'CurrentUserContex.Protocol' 未确认协议 'AnyObject'

所以我尝试了:

ServiceLocator.locate(CurrentUserContex.self as! AnyObject)

但后来我得到:

Could not cast value of type 'ApplicationName.CurrentUserContex.Protocol' (0x7fec15e52348) to 'Swift.AnyObject' (0x7fec15d3d4f8).

如果 CurrentUserContex 是协议本身的名称,我建议使用它:

ServiceLocator.locate(CurrentUserContex.self)

如果CurrentUserContex是一个协议类型的变量:

ServiceLocator.locate(CurrentUserContex)

希望这能解决您的问题

在Swift中你必须传递一个class(所有classes都符合AnyObject协议)。所以 CurrentUserContex 也必须是 class,你可以尝试使用 .self 或不使用(不幸的是,我没有足够的参考来告诉你确切使用哪个)。

尝试

ServiceLocator.locate(CurrentUserContex.self as Protocol)

或(在某些带有错误的版本中 Protocol 由于某种原因未被识别为 AnyObject):

ServiceLocator.locate((CurrentUserContex.self as Protocol) as! AnyObject)

作为方法参数的协议:

protocol Describable: class{ var text: String { get } }
class A: Describable { var text: String; init(_ text: String) { self.text = text } }
class B: A {}
class C {}


let a = A("I am a")
let b = B("I am b")
let c = C()

func ofType<T>(instance: Any?,_ type: T.Type) -> T? { /*<--we use the ? char so that it can also return a nil*/
    if (instance as? T != nil) { return instance as? T }
    return nil
}

Swift.print(ofType(a, A.self)!.text) // I am a
Swift.print(ofType(a, Describable.self)!.text) // I am a
Swift.print(ofType(b, B.self)!.text) // I am b
Swift.print(ofType(c, C.self)) // instance of c