Используйте grep
или grepl
, но имейте в виду, хотите ли вы использовать регулярные выражения.
По умолчанию grep
и связанные с ним принимают регулярное выражение , чтобы соответствовать, а не буквальной подстроке. Если вы этого не ожидаете, и вы пытаетесь выполнить сопоставление с недопустимым регулярным выражением, это не сработает:
> grep("[", "abc[")
Error in grep("[", "abc[") :
invalid regular expression '[', reason 'Missing ']''
Чтобы выполнить истинный тест подстроки, используйте fixed = TRUE
.
> grep("[", "abc[", fixed = TRUE)
[1] 1
Если вам действительно нужно регулярное выражение, отлично, но это не то, о чем OP спрашивает.
Если вы добавляете функции к классу в расширении (то есть их нет в определении класса), то эти методы статически отправляются в 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())