ЛюбойОбъект против Структуры (Любой)

Я хотел бы создать такой метод для моих проектов:

func print(obj: AnyObject) {
    if let rect = obj as? CGRect {
        println(NSStringFromCGRect(rect))
    }
    else if let size = obj as? CGSize {
        println(NSStringFromCGSize(size))
    }

    //...
}

Но я не могу, потому что CGRect а также CGSize являются structи не соответствуют AnyObjectprotocol, Итак, есть идеи о том, как это можно сделать?

4 ответа

Решение

Ответ @nkukushkin правильный, однако, если вам нужна функция, которая ведет себя по-разному в зависимости от того, была ли она передана CGRect или CGStruct, вам лучше с перегрузкой

func print(rect: CGRect) {
    println(NSStringFromCGRect(rect))
}

func print(size: CGSize) {
    println(NSStringFromCGSize(size))
}

Для сравнения Any будет неэффективным (преобразование ваших структур в Any и обратно, может иметь большое влияние, если вы делаете это много в узком цикле), и не типизированный (вы можете передать что-нибудь в эту функцию, и она потерпит неудачу только во время выполнения).

Если вы намереваетесь привести оба типа к общему типу, а затем выполнить ту же операцию над ним, вы можете создать третью перегрузку, которая принимает этот тип, и два других вызовут его.

Использование Any вместо AnyObject,

Swift предоставляет два псевдонима специальных типов для работы с неспецифическими типами:

AnyObject может представлять экземпляр любого типа класса.
Any может представлять экземпляр любого типа вообще, включая типы функций.

Язык программирования Swift

Просто обнаружил гораздо лучший способ сделать это. У Swift есть метод dump, который работает с множеством видов данных.

Например:

dump(CGRectMake(0, 5, 30, 60))

Распечатает:

{x 0 y 5 w 30 h 60}

Если вам просто нужно распечатать CGRect или же CGSize, вы можете использовать:

println(rect)

или же

println(size)

Вы оставили "..." в конце своей функции, поэтому я предполагаю, что вам нужно напечатать больше типов. Для этого нужно, чтобы эти типы соответствовали Printable протокол (если они уже делают). Вот пример того, как -

class Car { 
    var mileage = 0
}

extension Car : Printable {
    var description: String { 
        return "A car that has travelled \(mileage) miles."
    }
}

Вы можете использовать:

let myCar = Car()
println(myCar)

Кроме того, вы можете изменить формат способа печати типа. Например, если вы хотели println(aRect) в том же формате, который возвращается NSStringFromCGRect Вы можете использовать расширение:

extension CGRect : Printable {
    public var description: String {
        return "{\(origin.x), \(origin.y)}, {\(size.width), \(size.height)}"
    }
}
Другие вопросы по тегам