在 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
如何在 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