2016-01-17 6 views
1

Пробовал это, и это дает мне ошибку:Как я могу вернуть self в методе класса?

class BaseClass { 
    class var testProperty: String { 
     return "Original" 
    } 
    class func testingFunc()->Self { 
     return self // error - Can not convert return expression of type "Self.Type" to return the type "Self" 
    } 
} 

Любая мысль? Спасибо

+1

Чего вы пытаетесь достичь? Я думаю, что синглтон может вам помочь. – Alexander

ответ

6

В классе/статической функции self относится к типу класса. Нет экземпляра для ссылки, так что вы получаете тип, который является текущей областью. Это не то же самое в методе экземпляра, где само относится к <instance>.self

class Foo { 
    class func classMethod() -> Foo.Type { 
     return self // means Foo.self 
    } 

    func instanceMethod() -> Foo { 
     return self // means <instance of Foo>.self 
    } 
} 
+0

Что делать, если я хочу вернуть экземпляр текущего типа из статического mathod, например: let currentClass: = self(); return currentClass ?? –

+0

Я уже ответил на ваш вопрос в опубликованном вами документе: https://gist.github.com/anonymous/44a108093e45db43b6df Тип возвращаемого значения будет по-прежнему «BaseClass», но поскольку «ChildClass» является подклассом «BaseClass», 'testProperty' является известным членом класса. Другое дело, если вы добавляете другой член в 'ChildClass' и пытаетесь его использовать. –

1

Ваш тип возврата должен быть типом класса, в котором вы находитесь. В этом случае это BaseClass.

Кроме того, вы определяете функцию класса, которая является в основном статической функцией. Он не вернет экземпляр. Я не совсем понимаю, чего вы пытаетесь достичь.

+0

Но я могу назвать себя внутри вышеупомянутого статического метода, такого как self.testProperty. Я пытаюсь выполнить базовый базовый класс, поэтому, если из него получен дочерний класс, и я вызываю метод testFunc() из дочернего класса, он должен возвращать дочерний тип со свойствами и т. Д. См. Пример того, что я пытаюсь выполнить: https: //gist.github.com/anonymous/44a108093e45db43b6df –

+0

Ну, вы можете ссылаться, но не можете вернуть его так, как вы думаете. Типы просто не совпадают, и это дает ошибку компиляции. Может быть, вы можете попробовать Self.Type как возвращаемый тип? –

0

Если вы хотите получить информацию об экземпляре, используйте функцию экземпляра. При определении функции опустите ключевое слово class.

class BaseClass { 
    func instanceInfo() { 
     // self here refers to the instance 
    } 
} 
Смежные вопросы