亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

協議函數返回自

協議函數返回自

偶然的你 2019-07-13 10:07:31
協議函數返回自我有一個協議P,它返回對象的副本:protocol P {     func copy() -> Self}以及實現P的類C:class C : P {     func copy() -> Self {         return C()     }}但是,是否將返回值作為Self我得到以下錯誤:無法將“C”類型的返回表達式轉換為返回類型“Self”我也試著回去C.class C : P {     func copy() -> C  {         return C()     }}這導致以下錯誤:非終級“C”中的方法“Copy()”必須返回Self遵守“P”協議除了我前綴的情況外,什么都不起作用。class C帶著final(如:final class C : P {     func copy() -> C  {         return C()     }}但是,如果我想要子類C,那么什么都不能工作。有辦法繞過這件事嗎?
查看完整描述

3 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

問題是,您正在做出編譯器無法證明您將遵守的承諾。

所以你創造了這樣的承諾:copy()將返回自己的類型,完全初始化。

但是你實現了copy()這樣:

func copy() -> Self {
    return C()}

現在我是一個不覆蓋的子類copy()..我還給你一個C,而不是完全初始化Self(這是我答應過的)。所以這樣不好。不如:

func copy() -> Self {
    return Self()}

嗯,這不會編譯,但即使編譯了,也是沒有好處的。子類可能沒有簡單的構造函數,因此D()甚至可能是不合法的。(盡管見下文)

好吧,那么:

func copy() -> C {
    return C()}

是的,但那不會回來Self..它回來了C..你還是沒信守諾言。

“但是objc可以做到!”算是吧。主要是因為它不在乎你是否像斯威夫特那樣信守諾言。如果你不能實現copyWithZone:在子類中,可能無法完全初始化對象。編譯器甚至不會警告您已經這樣做了。

“但是objc中的大多數東西都可以翻譯成SWIFT,而objc有NSCopying“是的,它是這樣定義的:

func copy() -> AnyObject!

所以你可以做同樣的(沒有理由!)在此):

protocol Copyable {
  func copy() -> AnyObject}

上面寫著“我不會保證你會得到什么。”你也可以說:

protocol Copyable {
  func copy() -> Copyable}

這是你可以做出的承諾。

但是我們可以考慮一下C+,記住我們有一個承諾能,會,可以制作,使。我們可以保證,我們和所有子類都將實現特定類型的初始化器,SWIFT將強制執行這一點(因此可以證明我們說的是實話):

protocol Copyable {
  init(copy: Self)}class C : Copyable {
  required init(copy: C) {
    // Perform your copying here.  }}

這就是你應該做的拷貝。

我們可以更進一步,但是dynamicType,我還沒有對它進行廣泛的測試,以確保這始終是我們想要的,但它應該是正確的:

protocol Copyable {
  func copy() -> Self
  init(copy: Self)}class C : Copyable {
  func copy() -> Self {
    return self.dynamicType(copy: self)
  }

  required init(copy: C) {
    // Perform your copying here.  }}

在這里,我們保證有一個初始化程序為我們執行副本,然后我們可以在運行時確定要調用哪一個,給出您要尋找的方法語法。


查看完整回答
反對 回復 2019-07-13
?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

使用SWIFT 2,我們可以使用協議擴展。

protocol Copyable {
    init(copy:Self)}extension Copyable {
    func copy() -> Self {
        return Self.init(copy: self)
    }}


查看完整回答
反對 回復 2019-07-13
?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

還有一種方法可以實現你想做的事情,那就是利用SWIFT的關聯類型。下面是一個簡單的例子:

public protocol Creatable {

    associatedtype ObjectType = Self

    static func create() -> ObjectType}class MyClass {

    // Your class stuff here}extension MyClass: Creatable {

    // Define the protocol function to return class type    static func create() -> MyClass {

         // Create an instance of your class however you want        return MyClass()
    }}let obj = MyClass.create()


查看完整回答
反對 回復 2019-07-13
  • 3 回答
  • 0 關注
  • 443 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號