Переопределение не-@ objc объявлений из расширений не поддерживается

Используйте grep или grepl, но имейте в виду, хотите ли вы использовать регулярные выражения.

По умолчанию grep и связанные с ним принимают регулярное выражение , чтобы соответствовать, а не буквальной подстроке. Если вы этого не ожидаете, и вы пытаетесь выполнить сопоставление с недопустимым регулярным выражением, это не сработает:

> grep("[", "abc[")
Error in grep("[", "abc[") : 
  invalid regular expression '[', reason 'Missing ']''

Чтобы выполнить истинный тест подстроки, используйте fixed = TRUE.

> grep("[", "abc[", fixed = TRUE)
[1] 1

Если вам действительно нужно регулярное выражение, отлично, но это не то, о чем OP спрашивает.

1
задан michaeldebo 26 March 2019 в 18:43
поделиться

1 ответ

Если вы добавляете функции к классу в расширении (то есть их нет в определении класса), то эти методы статически отправляются в swift, потому что компилятор не может добавить методы в vtable класса (т. Е. Нужно сделать vtable во время компиляции, но вы можете добавить расширение позже, например, в другом модуле). Вот почему компилятор жалуется, что вы не можете override методы (т.е. они не виртуальные).

Диспетчер Objective C работает по-другому, через таблицу выбора, и его можно изменить даже во время выполнения. Вот почему компилятор говорит использовать @objc и, конечно, если вы сделаете это, он будет работать.

ПРИМЕР:

Это не компилируется, потому что мы пытаемся переопределить и динамически отправить статически отправляемую не виртуальную функцию в swift

extension UITableViewCell {
    func a() {
        print("UITableViewCell")
    }
}

class B: UITableViewCell {
    override func a() {
        print("B")
    }
}

let b = B()
print(b.a())

Это работает и печатает «B», потому что с использованием селектора objc

import UIKit
import PlaygroundSupport

extension UITableViewCell {
    @objc func a() {
        print("UITableViewCell")
    }
}

class B: UITableViewCell {
    override func a() {
        print("B")
    }
}

let b = B()
print(b.a())
0
ответ дан Josh Homann 26 March 2019 в 18:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: