第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

協(xié)議函數(shù)返回自

協(xié)議函數(shù)返回自

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

3 回答

?
POPMUISE

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個贊

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

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

但是你實(shí)現(xiàn)了copy()這樣:

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

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

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

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

好吧,那么:

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

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

“但是objc可以做到!”算是吧。主要是因?yàn)樗辉诤跄闶欠裣袼雇蛱啬菢有攀刂Z言。如果你不能實(shí)現(xiàn)copyWithZone:在子類中,可能無法完全初始化對象。編譯器甚至不會警告您已經(jīng)這樣做了。

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

func copy() -> AnyObject!

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

protocol Copyable {
  func copy() -> AnyObject}

上面寫著“我不會保證你會得到什么?!蹦阋部梢哉f:

protocol Copyable {
  func copy() -> Copyable}

這是你可以做出的承諾。

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

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

這就是你應(yīng)該做的拷貝。

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

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.  }}

在這里,我們保證有一個初始化程序?yàn)槲覀儓?zhí)行副本,然后我們可以在運(yùn)行時確定要調(diào)用哪一個,給出您要尋找的方法語法。



查看完整回答
反對 回復(fù) 2019-08-05
?
SMILET

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個贊

使用SWIFT 2,我們可以使用協(xié)議擴(kuò)展。

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




查看完整回答
反對 回復(fù) 2019-08-05
?
www說

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個贊

還有一種方法可以實(shí)現(xiàn)你想做的事情,那就是利用SWIFT的關(guān)聯(lián)類型。下面是一個簡單的例子:

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




查看完整回答
反對 回復(fù) 2019-08-05
  • 3 回答
  • 0 關(guān)注
  • 374 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號