ЛюбойОбъект против Структуры (Любой)
Я хотел бы создать такой метод для моих проектов:
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
и не соответствуют AnyObject
protocol
, Итак, есть идеи о том, как это можно сделать?
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 есть метод 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)}"
}
}