Estructura del proyecto ImageScout
ImageScout es una biblioteca escrita en Swift diseñada para identificar rápidamente el tipo y tamaño de imágenes remotas sin descargar todo su contenido. Soporta formatos PNG, GIF y JPEG. El proyecto sigue una estructura clara y modular que facilita su integración y mantenimiento.
ImageScout/
├── Sources/
│ └── ImageScout/
│ ├── ImageScout.swift
│ └── ImageParser.swift
├── Tests/
│ └── ImageScoutTests/
│ └── ImageDetectionTests.swift
├── ImageScout.xcodeproj
├── ImageScout.xcworkspace
├── LICENSE
├── README.md
├── ImageScout.podspec
├── Package.swift
├── .gitignore
└── ...
- Sources/: Contiene el código fuente principal. El directorio ImageScout/ alberga los archivos clave como
ImageScout.swift, que define la API pública, yImageParser.swift, responsable del análisis binario de encabezados de imagen. - Tests/: Incluye pruebas unitarias. Los casos de prueba en
ImageDetectionTests.swiftvalidan el correcto reconocimiento de formatos y dimensiones. - ImageScout.xcodeproj y ImageScout.xcworkspace: Archivos necesarios para trabajar con Xcode.
- LICENSE: Define la licencia MIT bajo la cual se distribuye el proyecto.
- README.md: Documentación inicial con instruccinoes de uso y ejemplos.
- ImageScout.podspec: Configuraicón para CocoaPods, especificando versión, dependencias y ubicación del código.
- Package.swift: Archivo de configuración para Swift Package Manager, definido para Swift 5.3 o superior.
- .gitignore: Excluye archivos temporales y de compilación del control de versiones.
Funcionalidad principal: ImageScout.swift
El archivo central ImageScout.swift expone una interfaz asíncrona para detectar información de imágenes a partir de una URL. Utiliza un descarga mínima (solo los primeros bytes) para determinar el formato y dimensiones.
import Foundation
public class ImageScout {
public func analyzeImage(at url: String, completionHandler: @escaping (Error?, CGSize, ImageFormat) -> Void) {
guard let url = URL(string: url) else {
completionHandler(NSError(domain: "InvalidURL", code: -1, userInfo: nil), .zero, .unknown)
return
}
var request = URLRequest(url: url)
request.httpMethod = "HEAD"
request.setValue("bytes=0-1024", forHTTPHeaderField: "Range")
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
completionHandler(error, .zero, .unknown)
return
}
guard let data = data, !data.isEmpty else {
completionHandler(NSError(domain: "EmptyResponse", code: -2, userInfo: nil), .zero, .unknown)
return
}
let format = determineImageFormat(from: data)
let size = calculateDimensions(for: format, from: data)
completionHandler(nil, size, format)
}.resume()
}
}
Configuración para integración
El archivo ImageScout.podspec permite incluir la librería mediante CocoaPods:
Pod::Spec.new do |spec|
spec.name = "ImageScout"
spec.version = "2.1.0"
spec.summary = "Fast image type and size detection in Swift"
spec.description = "Detects image format and dimensions with minimal download using Swift."
spec.homepage = "https://github.com/kaishin/ImageScout"
spec.license = { :type => "MIT", :file => "LICENSE" }
spec.author = { "Reda Lemeden" => "hello@redalemeden.com" }
spec.source = { :git => "https://github.com/kaishin/ImageScout.git", :tag => "v#{spec.version}" }
spec.platform = :ios, "8.0"
spec.source_files = "Sources/ImageScout/**/*.swift"
spec.requires_arc = true
end
Para Swift Package Manager, el Package.swift define el paquete como una biblioteca con un destino de prueba:
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "ImageScout",
products: [
.library(name: "ImageScout", targets: ["ImageScout"])
],
dependencies: [],
targets: [
.target(name: "ImageScout", dependencies: []),
.testTarget(name: "ImageScoutTests", dependencies: ["ImageScout"])
]
)
Este diseño permite una fácil integración en proyectos iOS, macOS y otros entornos compatibles con Swift.