在可选类型上调用静态函数

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()

这对FooFoo? 都有效

【讨论】:

这是我需要的。谢谢!【参考方案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?没有通过?

以上是关于在可选类型上调用静态函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在可选类型中使用 numpy

c#如何创建类 调用

派生类型的自动静态调用

如何区分静态函数与 C 中的 nm 或 readelf 输出

从基类调用静态函数

nodejs通过函数名进行静态方法调用出现类型错误,为啥?