作った理由
SwiftのArrayで Out Of Range でよく?落ちる
特にエラーを返す可能性のあるAPIとかで数値を間違えることがしばしば...
というわけで落ちないタイプの配列をつくった
ついでにnilを返さない辞書型も作った。
使い方
let array = ["a","b","c"]
print(array[safe: 1])//"b"
print(array[safe: 5])//""
print(array[force: 1])//Optional("b")
print(array[force: 5])//nil
let dict = ["a":"apple","b":"banana","c":"cap"]
print(dict[safe: "a"])//"apple"
print(dict[safe: "d"])//""
実装
import UIKit
protocol DefaultValueContainedType {
static var defaultValue: Self { get }
}
extension Array {
subscript (force index:Int)->Element?{
switch index {
case self.indices:
return self[index]
default:
return nil
}
}
}
extension Array where Element: DefaultValueProtocol{
subscript (safe index: Int) -> Element {
return self[force: index] ?? Element.defaultValue
}
}
extension Dictionary where Value: DefaultValueProtocol {
subscript (safe index: Key) -> Value {
return self[index] ?? Value.defaultValue
}
}
extension Int: DefaultValueProtocol {
static var defaultValue: Int {
return 0
}
}
extension Bool:defaultValueProtocol{
static var defaultValue: Bool{
return false
}
}
extension Double:defaultValueProtocol{
static var defaultValue: Double{
return 0.0
}
}
extension Float:defaultValueProtocol{
static var defaultValue: Float{
return 0.0
}
}
extension CGFloat:defaultValueProtocol{
static var defaultValue: CGFloat{
return 0.0
}
}
extension String:defaultValueProtocol{
static var defaultValue: String{
return ""
}
}
extension Array :defaultValueProtocol{
static var defaultValue: Array{
return []
}
}
extension Dictionary :defaultValueProtocol{
static var defaultValue: Dictionary{
return [:]
}
}
extension NSData: defaultValueProtocol{
static var defaultValue: NSData{
return NSData()
}
}