Я решил проблему с помощью следующего кода, который отлично работает с каждым аспектом, упомянутым в вопросе, подобным Snapchat и Instagram:
var pointSize: CGFloat = 0
@objc func pinchRecoginze(_ pinchGesture: UIPinchGestureRecognizer) {
guard pinchGesture.view != nil else {return}
let view = pinchGesture.view!
if (pinchGesture.view is UILabel) {
let textLabel = view as! UILabel
if pinchGesture.state == .began {
let font = textLabel.font
pointSize = font!.pointSize
pinchGesture.scale = textLabel.font!.pointSize * 0.1
}
if 1 <= pinchGesture.scale && pinchGesture.scale <= 10 {
textLabel.font = UIFont(name: textLabel.font!.fontName, size: pinchGesture.scale * 10)
resizeLabelToText(textLabel: textLabel)
}
}
}
func resizeLabelToText(textLabel : UILabel) {
let labelSize = textLabel.intrinsicContentSize
textLabel.bounds.size = labelSize
}
Необходимо смочь имитировать подпись метода расширения OrderBy:
Обновите 1, необходимо быть явными в первом универсальном параметре к keySelector Func. Я собираюсь взять предположение в Вашем типе и назвать его "Песней".
public void Sort<TKey>(SortOrder sortOrder,
Func<Song, TKey> keySelector)
{
if (sortOrder == SortOrder.Descending)
{
_list = _list.OrderByDescending(keySelector).ToList();
}
else
{
_list = _list.OrderBy(keySelector).ToList();
}
}
Теперь можно назвать "Вид" как это:
Sort(SortOrder.Descending, x => x.Album);
Обновление 2
Развитие комментария Tom Lokhorst: Если Вы хотите предопределить некоторые краткие критерии сортировки, Вы могли бы сделать так путем определения класса как это:
public static class SortColumn
{
public static readonly Func<Song, string> Artist = x => x.Artist;
public static readonly Func<Song, string> Album = x => x.Album;
}
Теперь можно просто звонить:
Sort(SortOrder.Descending, SortColumn.Artist);
Вы могли бы попытаться использовать универсальный компаратор.
Я думаю, что необходимо добавить дополнительный метод к IList<T>
:
public static class extIList {
public static IList<T> Sort<T, TKey>(this IList<T> list, SortOrder sortOrder, Func<T, TKey> keySelector) {
if (sortOrder == SortOrder.Descending) {
return list.OrderByDescending(keySelector).ToList();
} else {
return list.OrderBy(keySelector).ToList();
}
}
}
и затем можно использовать симпатичный с каждый Вашим объекты:
IList<Person> list = new List<Person>();
list.Add(new Person("David","Beckham"));
list.Add(new Person("Gennaro","Gattuso"));
list.Add(new Person("Cristian","Carlesso"));
list = list.Sort(SortOrder.Descending, X => X.Name);
PS SortOrder уже существует:
using System.Data.SqlClient;
Кажется, что сортировка берет собственную жизнь, если у Вас есть несколько методов, выделенных ей. Возможно, они могут быть собраны в класс.
public enum SortOrder
{
Ascending = 0,
Descending = 1
}
public class Sorter<T>
{
public SortOrder Direction { get; set; }
public Func<T, object> Target { get; set; }
public Sorter<T> NextSort { get; set; }
public IOrderedEnumerable<T> ApplySorting(IEnumerable<T> source)
{
IOrderedEnumerable<T> result = Direction == SortOrder.Descending ?
source.OrderByDescending(Target) :
source.OrderBy(Target);
if (NextSort != null)
{
result = NextSort.ApplyNextSorting(result);
}
return result;
}
private IOrderedEnumerable<T> ApplyNextSorting
(IOrderedEnumerable<T> source)
{
IOrderedEnumerable<T> result = Direction == SortOrder.Descending ?
source.ThenByDescending(Target) :
source.ThenBy(Target);
return result;
}
}
Вот демонстрационное использование:
List<string> source = new List<string>()
{ "John", "Paul", "George", "Ringo" };
Sorter<string> mySorter = new Sorter<string>()
{
Target = s => s.Length,
NextSort = new Sorter<string>()
{
Direction = SortOrder.Descending,
Target = s => s
}
};
foreach (string s in mySorter.ApplySorting(source))
{
Console.WriteLine(s);
}
Выводом является Paul, John, Ringo, George.