objective c - нуля - Как я могу вернуть instancetype в Swift




using swift with cocoa and objective-c (3)

Когда вы используете Swift API из Objective-C, компилятор обычно выполняет прямой перевод. Например, Swift API func playSong(name: String) импортируется как - (void)playSong:(NSString *)name в Objective-C.

Однако есть одно исключение: когда вы используете инициализатор Swift в Objective-C, компилятор добавляет текст « initWith » в начало метода и правильно заглавывает первый символ в исходном инициализаторе.

Например, этот инициализатор Swift инициализации init (songName: String, artist: String) импортируется как - (instancetype)initWithSongName:(NSString *)songName artist:(NSString *)artist в Objective-C.

На этот вопрос уже есть ответ:

Я хочу сделать расширение некоторого класса для возврата объекта типа времени выполнения

например, я создаю extenstion класса A

extension A {
    class func niceObject() -> XXXXX { // in objective-c is instancetype
        return ....
    }
}

Итак, кто-нибудь знает, есть ли ключевое слово instancetype в Swift или нет, чтобы заменить xxxxx и я могу вызвать эту функцию в подклассе A без ручного приведения

var b: B = B.niceObject()

Спасибо


По крайней мере, в прокотолях вы можете использовать « Self . Это представляет собой фактический тип « self . Не уверен в расширениях, хотя ...

Например, см. Определение Equatable :

protocol Equatable {
    func ==(lhs: Self, rhs: Self) -> Bool
}

Ты можешь это сделать. Код детской площадки ниже. Это self (), что niceObject () должен вернуться. Кроме того, у вас должен быть required init в базовом классе.

class A {
    required init() {
    }

    func whatClassAmI() -> String {
        return "Class A"
    }
}

class B: A {
    required init() {
        super.init()
    } 
    override func whatClassAmI() -> String {
        return "Class B"
    }
}

let a = A()
let sa = a.whatClassAmI() // "Class A", of course

let b = B()
let sb = b.whatClassAmI() // "Class B", of course

extension A {
    class func niceObject() -> Self {
        return self.init()
    }
}

let aa = A.niceObject()
let saa = aa.whatClassAmI() // "Class A"

let bb = B.niceObject()
let sbb = bb.whatClassAmI() // "Class B", as required






swift