在可选类型上调用静态函数
Posted
技术标签:
【中文标题】在可选类型上调用静态函数【英文标题】:Call a static func on optional type 【发布时间】:2017-07-25 12:23:56 【问题描述】:我有一个协议、符合标准的类和一个具有一个简单功能的类。
protocol Outputable
static func output()
class Foo: Outputable
static func output()
print("output")
class Bar
func eat(_ object: AnyObject?)
if let object = object, let objectType = type(of: object) as? Outputable.Type
objectType.output()
let foo = Foo()
let bar = Bar()
var fooOptional: Foo?
bar.eat(foo) // prints 'output'
bar.eat(fooOptional) // print nothing
有什么方法可以传递一些可选类型为 nil 但符合Outputable
协议并在eat
函数中调用协议的静态函数?即使它是零,我仍然在传递一个类型,这就是我在里面吃的所有东西,对吧?
为了更清楚。我知道为什么最后一行什么也没打印。但是有没有办法调整eat
以打印出那个“输出”字符串?
【问题讨论】:
【参考方案1】:实现您所寻求的方法之一是使用泛型并在类型上调用您的方法:
func eat<T: Outputable>(_ object: T?)
T.output()
这对Foo
和Foo?
都有效
【讨论】:
这是我需要的。谢谢!【参考方案2】:您可以扩展 Optional
以符合您的协议。
protocol Outputable
func output()
extension Optional: Outputable
func output()
switch self
case .some(let object):
print("I have an object: \(object)")
case .none:
print("I'm nil")
class Foo
class Bar
func eat(_ object: AnyObject?)
if let object = object as? Outputable
object.output()
var foo: Foo?
let bar = Bar()
bar.eat(foo) // prints "I'm nil"
【讨论】:
谢谢。即使它无助于鼓舞人心。【参考方案3】:在
处设置断点if let object = object, let objectType = type(of: object) as? Outputable.Type
objectType.output()
你会意识到objectType.output()
没有被调用。 if let
仅当右侧对象不为零时才能快速成功。在你的情况下这是零。
【讨论】:
【参考方案4】:如果你重写你的测试,为什么它不工作的逻辑会变得更清楚。
class Bar
func eat(_ object: AnyObject?)
if let object = object
if let objectType = type(of: object) as? Outputable.Type
objectType.output()
else
print("Mismatch on type")
else
print("No object provided")
演出:
输出 未提供对象【讨论】:
我没有强调它,但我知道它为什么不起作用。有没有办法让它工作?即使与Foo?没有通过?以上是关于在可选类型上调用静态函数的主要内容,如果未能解决你的问题,请参考以下文章