Необходимость абстрактных свойств может указывать на проблемы проектирования. Хотя во многих ответах реализован тип шаблона шаблона , и он работает, он всегда выглядит несколько странно.
Давайте посмотрим на оригинальный пример:
abstract class Foo_Abstract {
abstract public $tablename;
}
class Foo extends Foo_Abstract {
//Foo must 'implement' $property
public $tablename = 'users';
}
Чтобы отметить что-то abstract
, нужно указать, что это необходимо. Итак, обязательное значение (в данном случае) является обязательной зависимостью, поэтому ее следует передать конструктору во время создания экземпляра :
class Table
{
private $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function name(): string
{
return $this->name;
}
}
Тогда если вам действительно нужен более конкретный именованный класс, вы можете наследовать так:
final class UsersTable extends Table
{
public function __construct()
{
parent::__construct('users');
}
}
Это может быть полезно, если вы используете DI-контейнер и вам нужно передавать разные таблицы для разных объектов.
Вы хотите, чтобы ваш поиск был нечувствительным к диакритическим знакам, чтобы соответствовать «é» в pensée и «e» в pensee. Вы получите это, добавив [d] после атрибута. Вот так:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(songTitle like[cd] %@)", yourSongSubstring];
'c' в [cd] означает нечувствительность к регистру.
Так как ваша строка может появляться в любом порядке в строке, которую вы ищете, вы можете токенизировать строку поиска ([... componentsByString: @ ""]), а затем создать предикат, например
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(songTitle like[cd] %@) and (songTitle like[cd] %@)", songToken1, songToken2];
Этот синтаксис для объединения предикатов выше может быть выключено, идёт по памяти. Я считаю, что вы хотите использовать здесь SearchKit . Я говорю это так, как будто я только что облегчил вашу работу ... Я этого не делал, но в нем должны быть инструменты, необходимые для успеха здесь. LNC по-прежнему предлагает свой SearchKit Podcast бесплатно (очень приятно).
В этом случае каждый трек будет документом, и вам нужно будет найти хороший способ их индексировать с помощью идентификатор, который можно использовать для их поиска. Затем вы можете загрузить их с метаданными и выполнить поиск. Возможно, размещение заголовка «внутри» документа было бы здесь полезным для облегчения использования поиска по сходству ( kSKSearchOptionFindSimilar
). Это может сработать, а может и не сработать.
Вопрос, который вы задали, хороший, но, конечно, для этого нет отраслевого стандарта, потому что любой, кто хорошо решает эту проблему (то есть каждая основная поисковая система), хранит свои алгоритмы в строжайшем секрете. Это сложная проблема; никто не готов дать свой ответ.