2017-07-25 47 views
0

我有一個協議,符合類和一個類與一個簡單的功能。調用可選類型的靜態函數

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 

有沒有辦法通過一些可選類型是零,但符合Outputable協議,並調用內部eat功能協議的靜態函數?即使它是零,我仍然通過一種類型,這就是我應該需要在裏面吃,對吧?

爲了更清楚。我知道爲什麼最後一行什麼都不打印但有沒有辦法調整eat來打印'輸出'字符串?

回答

1

一個你可以實現你正在尋找什麼方法是使用仿製藥,並調用你的方法對類型:

func eat<T: Outputable>(_ object: T?) { 
    T.output() 
} 

這兩個FooFoo?

+0

這就是我所需要的。謝謝! –

0

把一個破發點,在

if let object = object, let objectType = type(of: object) as? Outputable.Type { 
    objectType.output() 
} 

你會意識到,objectType.output()不會被調用。 if let只有當右側的對象不爲零時纔會成功。你的情況沒有。

0

如果你重寫你的測試,爲什麼它不工作的邏輯變得更清晰。

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") 
     } 
    } 
} 

表演:

  • 輸出
  • 沒有對象提供
+0

我沒工作沒有壓力,但我知道爲什麼它不工作。有沒有辦法讓它工作?即使有Foo?沒有通過? –

1

可以擴展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" 
+0

謝謝。儘管它無助於鼓舞人心。 –