├── .gitignore ├── CHANGES ├── README.md ├── Swift-Useful-Extensions.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── Swift-Useful-Extensions.xccheckout └── xcuserdata │ ├── Yin.xcuserdatad │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ │ ├── Swift-Useful-Extensions.xcscheme │ │ └── xcschememanagement.plist │ └── adam.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── Swift-Useful-Extensions.xcscheme │ └── xcschememanagement.plist ├── Swift-Useful-Extensions ├── AppDelegate.swift ├── Base.lproj │ └── Main.storyboard ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ ├── LaunchImage.launchimage │ │ └── Contents.json │ └── avatar.imageset │ │ ├── Contents.json │ │ └── avatar.jpg ├── Info.plist ├── UsefulExtensions.swift └── ViewController.swift ├── Swift-Useful-ExtensionsTests ├── Info.plist └── Swift_Useful_ExtensionsTests.swift └── VERSION /.gitignore: -------------------------------------------------------------------------------- 1 | /.DS_Store 2 | *.DS_Store 3 | *.xcuserstate 4 | -------------------------------------------------------------------------------- /CHANGES: -------------------------------------------------------------------------------- 1 | Version 1.0.1: 2 | - Making a bit more Swifty w/ type inference. Improving test output with higher contract ViewController. Cleaning up avatar image to better illustrate masking 3 | - Correcting format 4 | 5 | Version 1.0.0: 6 | - Updating readme and making the date methods a little more Swifty 7 | - Refined printout 8 | - Updating to Swift 3 9 | - add more setters for uiview 10 | - bug fixes for beta 5 11 | - Merge branch 'master' of https://github.com/yingogobot/Swift-Useful-Extensions 12 | - more ignore 13 | - Update README.md 14 | - Update README.md 15 | - Create README.md 16 | - git ingore 17 | - init 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Swift-Useful-Extensions 2 | ======================= 3 | 4 | 5 | ##Int Extension## 6 | isEven:Bool 7 | isOdd:Bool 8 | isPositive:Bool 9 | isNegative:Bool 10 | toDouble:Double 11 | toFloat:Float 12 | digits:Int 13 | 14 | ##Double Extension## 15 | roundTo(decimals:Int) -> Double 16 | 17 | ##String Extension## 18 | contains(_ string:String) -> Bool 19 | contains(_ string:String, withCompareOptions compareOptions: NSString.CompareOptions) -> Bool 20 | reverse() -> String 21 | 22 | ##UIView## 23 | var width: CGFloat { get set } 24 | var height: CGFloat { get set } 25 | var size: CGFloat { get set } 26 | 27 | var origin:CGPoint { get set } 28 | var x:CGFloat { get set } 29 | var y:CGFloat { get set } 30 | var centerX:CGFloat { get set } 31 | var centerY:CGFloat { get set } 32 | 33 | 34 | var left:CGFloat { get set } 35 | var right:CGFloat { get set } 36 | var top:CGFloat { get set } 37 | var bottom:CGFloat { get set } 38 | 39 | roundCorner(radius:Float) 40 | 41 | ##NSDate## 42 | daysInBetween(_ date: NSDate) -> Double 43 | hoursInBetween(_ date: NSDate) -> Double 44 | minutesInBetween(_ date: NSDate) -> Double 45 | secondsInBetween(_ date: NSDate) -> Double 46 | 47 | ##UIImageView## 48 | roundImage() 49 | 50 | ##UIImage## 51 | croppedImage(bound : CGRect) -> UIImage 52 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 2D38189119469B6D00C0F80C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D38189019469B6D00C0F80C /* AppDelegate.swift */; }; 11 | 2D38189319469B6D00C0F80C /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D38189219469B6D00C0F80C /* ViewController.swift */; }; 12 | 2D38189619469B6D00C0F80C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2D38189419469B6D00C0F80C /* Main.storyboard */; }; 13 | 2D38189819469B6D00C0F80C /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2D38189719469B6D00C0F80C /* Images.xcassets */; }; 14 | 2D3818A419469B6D00C0F80C /* Swift_Useful_ExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D3818A319469B6D00C0F80C /* Swift_Useful_ExtensionsTests.swift */; }; 15 | 2D3818AE19469BB100C0F80C /* UsefulExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D3818AD19469BB100C0F80C /* UsefulExtensions.swift */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXContainerItemProxy section */ 19 | 2D38189E19469B6D00C0F80C /* PBXContainerItemProxy */ = { 20 | isa = PBXContainerItemProxy; 21 | containerPortal = 2D38188319469B6D00C0F80C /* Project object */; 22 | proxyType = 1; 23 | remoteGlobalIDString = 2D38188A19469B6D00C0F80C; 24 | remoteInfo = "Swift-Useful-Extensions"; 25 | }; 26 | /* End PBXContainerItemProxy section */ 27 | 28 | /* Begin PBXFileReference section */ 29 | 2D38188B19469B6D00C0F80C /* Swift-Useful-Extensions.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Swift-Useful-Extensions.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | 2D38188F19469B6D00C0F80C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 31 | 2D38189019469B6D00C0F80C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 32 | 2D38189219469B6D00C0F80C /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 33 | 2D38189519469B6D00C0F80C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 34 | 2D38189719469B6D00C0F80C /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 35 | 2D38189D19469B6D00C0F80C /* Swift-Useful-ExtensionsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Swift-Useful-ExtensionsTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 36 | 2D3818A219469B6D00C0F80C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37 | 2D3818A319469B6D00C0F80C /* Swift_Useful_ExtensionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Swift_Useful_ExtensionsTests.swift; sourceTree = ""; }; 38 | 2D3818AD19469BB100C0F80C /* UsefulExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UsefulExtensions.swift; sourceTree = ""; }; 39 | /* End PBXFileReference section */ 40 | 41 | /* Begin PBXFrameworksBuildPhase section */ 42 | 2D38188819469B6D00C0F80C /* Frameworks */ = { 43 | isa = PBXFrameworksBuildPhase; 44 | buildActionMask = 2147483647; 45 | files = ( 46 | ); 47 | runOnlyForDeploymentPostprocessing = 0; 48 | }; 49 | 2D38189A19469B6D00C0F80C /* Frameworks */ = { 50 | isa = PBXFrameworksBuildPhase; 51 | buildActionMask = 2147483647; 52 | files = ( 53 | ); 54 | runOnlyForDeploymentPostprocessing = 0; 55 | }; 56 | /* End PBXFrameworksBuildPhase section */ 57 | 58 | /* Begin PBXGroup section */ 59 | 2D38188219469B6D00C0F80C = { 60 | isa = PBXGroup; 61 | children = ( 62 | 2D38188D19469B6D00C0F80C /* Swift-Useful-Extensions */, 63 | 2D3818A019469B6D00C0F80C /* Swift-Useful-ExtensionsTests */, 64 | 2D38188C19469B6D00C0F80C /* Products */, 65 | ); 66 | sourceTree = ""; 67 | }; 68 | 2D38188C19469B6D00C0F80C /* Products */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 2D38188B19469B6D00C0F80C /* Swift-Useful-Extensions.app */, 72 | 2D38189D19469B6D00C0F80C /* Swift-Useful-ExtensionsTests.xctest */, 73 | ); 74 | name = Products; 75 | sourceTree = ""; 76 | }; 77 | 2D38188D19469B6D00C0F80C /* Swift-Useful-Extensions */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | 2D38189019469B6D00C0F80C /* AppDelegate.swift */, 81 | 2D38189219469B6D00C0F80C /* ViewController.swift */, 82 | 2D3818AD19469BB100C0F80C /* UsefulExtensions.swift */, 83 | 2D38189419469B6D00C0F80C /* Main.storyboard */, 84 | 2D38189719469B6D00C0F80C /* Images.xcassets */, 85 | 2D38188E19469B6D00C0F80C /* Supporting Files */, 86 | ); 87 | path = "Swift-Useful-Extensions"; 88 | sourceTree = ""; 89 | }; 90 | 2D38188E19469B6D00C0F80C /* Supporting Files */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 2D38188F19469B6D00C0F80C /* Info.plist */, 94 | ); 95 | name = "Supporting Files"; 96 | sourceTree = ""; 97 | }; 98 | 2D3818A019469B6D00C0F80C /* Swift-Useful-ExtensionsTests */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 2D3818A319469B6D00C0F80C /* Swift_Useful_ExtensionsTests.swift */, 102 | 2D3818A119469B6D00C0F80C /* Supporting Files */, 103 | ); 104 | path = "Swift-Useful-ExtensionsTests"; 105 | sourceTree = ""; 106 | }; 107 | 2D3818A119469B6D00C0F80C /* Supporting Files */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 2D3818A219469B6D00C0F80C /* Info.plist */, 111 | ); 112 | name = "Supporting Files"; 113 | sourceTree = ""; 114 | }; 115 | /* End PBXGroup section */ 116 | 117 | /* Begin PBXNativeTarget section */ 118 | 2D38188A19469B6D00C0F80C /* Swift-Useful-Extensions */ = { 119 | isa = PBXNativeTarget; 120 | buildConfigurationList = 2D3818A719469B6D00C0F80C /* Build configuration list for PBXNativeTarget "Swift-Useful-Extensions" */; 121 | buildPhases = ( 122 | 2D38188719469B6D00C0F80C /* Sources */, 123 | 2D38188819469B6D00C0F80C /* Frameworks */, 124 | 2D38188919469B6D00C0F80C /* Resources */, 125 | ); 126 | buildRules = ( 127 | ); 128 | dependencies = ( 129 | ); 130 | name = "Swift-Useful-Extensions"; 131 | productName = "Swift-Useful-Extensions"; 132 | productReference = 2D38188B19469B6D00C0F80C /* Swift-Useful-Extensions.app */; 133 | productType = "com.apple.product-type.application"; 134 | }; 135 | 2D38189C19469B6D00C0F80C /* Swift-Useful-ExtensionsTests */ = { 136 | isa = PBXNativeTarget; 137 | buildConfigurationList = 2D3818AA19469B6D00C0F80C /* Build configuration list for PBXNativeTarget "Swift-Useful-ExtensionsTests" */; 138 | buildPhases = ( 139 | 2D38189919469B6D00C0F80C /* Sources */, 140 | 2D38189A19469B6D00C0F80C /* Frameworks */, 141 | 2D38189B19469B6D00C0F80C /* Resources */, 142 | ); 143 | buildRules = ( 144 | ); 145 | dependencies = ( 146 | 2D38189F19469B6D00C0F80C /* PBXTargetDependency */, 147 | ); 148 | name = "Swift-Useful-ExtensionsTests"; 149 | productName = "Swift-Useful-ExtensionsTests"; 150 | productReference = 2D38189D19469B6D00C0F80C /* Swift-Useful-ExtensionsTests.xctest */; 151 | productType = "com.apple.product-type.bundle.unit-test"; 152 | }; 153 | /* End PBXNativeTarget section */ 154 | 155 | /* Begin PBXProject section */ 156 | 2D38188319469B6D00C0F80C /* Project object */ = { 157 | isa = PBXProject; 158 | attributes = { 159 | LastUpgradeCheck = 0820; 160 | ORGANIZATIONNAME = YinXuApp; 161 | TargetAttributes = { 162 | 2D38188A19469B6D00C0F80C = { 163 | CreatedOnToolsVersion = 6.0; 164 | }; 165 | 2D38189C19469B6D00C0F80C = { 166 | CreatedOnToolsVersion = 6.0; 167 | TestTargetID = 2D38188A19469B6D00C0F80C; 168 | }; 169 | }; 170 | }; 171 | buildConfigurationList = 2D38188619469B6D00C0F80C /* Build configuration list for PBXProject "Swift-Useful-Extensions" */; 172 | compatibilityVersion = "Xcode 3.2"; 173 | developmentRegion = English; 174 | hasScannedForEncodings = 0; 175 | knownRegions = ( 176 | en, 177 | Base, 178 | ); 179 | mainGroup = 2D38188219469B6D00C0F80C; 180 | productRefGroup = 2D38188C19469B6D00C0F80C /* Products */; 181 | projectDirPath = ""; 182 | projectRoot = ""; 183 | targets = ( 184 | 2D38188A19469B6D00C0F80C /* Swift-Useful-Extensions */, 185 | 2D38189C19469B6D00C0F80C /* Swift-Useful-ExtensionsTests */, 186 | ); 187 | }; 188 | /* End PBXProject section */ 189 | 190 | /* Begin PBXResourcesBuildPhase section */ 191 | 2D38188919469B6D00C0F80C /* Resources */ = { 192 | isa = PBXResourcesBuildPhase; 193 | buildActionMask = 2147483647; 194 | files = ( 195 | 2D38189619469B6D00C0F80C /* Main.storyboard in Resources */, 196 | 2D38189819469B6D00C0F80C /* Images.xcassets in Resources */, 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | }; 200 | 2D38189B19469B6D00C0F80C /* Resources */ = { 201 | isa = PBXResourcesBuildPhase; 202 | buildActionMask = 2147483647; 203 | files = ( 204 | ); 205 | runOnlyForDeploymentPostprocessing = 0; 206 | }; 207 | /* End PBXResourcesBuildPhase section */ 208 | 209 | /* Begin PBXSourcesBuildPhase section */ 210 | 2D38188719469B6D00C0F80C /* Sources */ = { 211 | isa = PBXSourcesBuildPhase; 212 | buildActionMask = 2147483647; 213 | files = ( 214 | 2D3818AE19469BB100C0F80C /* UsefulExtensions.swift in Sources */, 215 | 2D38189319469B6D00C0F80C /* ViewController.swift in Sources */, 216 | 2D38189119469B6D00C0F80C /* AppDelegate.swift in Sources */, 217 | ); 218 | runOnlyForDeploymentPostprocessing = 0; 219 | }; 220 | 2D38189919469B6D00C0F80C /* Sources */ = { 221 | isa = PBXSourcesBuildPhase; 222 | buildActionMask = 2147483647; 223 | files = ( 224 | 2D3818A419469B6D00C0F80C /* Swift_Useful_ExtensionsTests.swift in Sources */, 225 | ); 226 | runOnlyForDeploymentPostprocessing = 0; 227 | }; 228 | /* End PBXSourcesBuildPhase section */ 229 | 230 | /* Begin PBXTargetDependency section */ 231 | 2D38189F19469B6D00C0F80C /* PBXTargetDependency */ = { 232 | isa = PBXTargetDependency; 233 | target = 2D38188A19469B6D00C0F80C /* Swift-Useful-Extensions */; 234 | targetProxy = 2D38189E19469B6D00C0F80C /* PBXContainerItemProxy */; 235 | }; 236 | /* End PBXTargetDependency section */ 237 | 238 | /* Begin PBXVariantGroup section */ 239 | 2D38189419469B6D00C0F80C /* Main.storyboard */ = { 240 | isa = PBXVariantGroup; 241 | children = ( 242 | 2D38189519469B6D00C0F80C /* Base */, 243 | ); 244 | name = Main.storyboard; 245 | sourceTree = ""; 246 | }; 247 | /* End PBXVariantGroup section */ 248 | 249 | /* Begin XCBuildConfiguration section */ 250 | 2D3818A519469B6D00C0F80C /* Debug */ = { 251 | isa = XCBuildConfiguration; 252 | buildSettings = { 253 | ALWAYS_SEARCH_USER_PATHS = NO; 254 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 255 | CLANG_CXX_LIBRARY = "libc++"; 256 | CLANG_ENABLE_MODULES = YES; 257 | CLANG_ENABLE_OBJC_ARC = YES; 258 | CLANG_WARN_BOOL_CONVERSION = YES; 259 | CLANG_WARN_CONSTANT_CONVERSION = YES; 260 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 261 | CLANG_WARN_EMPTY_BODY = YES; 262 | CLANG_WARN_ENUM_CONVERSION = YES; 263 | CLANG_WARN_INFINITE_RECURSION = YES; 264 | CLANG_WARN_INT_CONVERSION = YES; 265 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 266 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 267 | CLANG_WARN_UNREACHABLE_CODE = YES; 268 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 269 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 270 | COPY_PHASE_STRIP = NO; 271 | ENABLE_STRICT_OBJC_MSGSEND = YES; 272 | ENABLE_TESTABILITY = YES; 273 | GCC_C_LANGUAGE_STANDARD = gnu99; 274 | GCC_DYNAMIC_NO_PIC = NO; 275 | GCC_NO_COMMON_BLOCKS = YES; 276 | GCC_OPTIMIZATION_LEVEL = 0; 277 | GCC_PREPROCESSOR_DEFINITIONS = ( 278 | "DEBUG=1", 279 | "$(inherited)", 280 | ); 281 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 282 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 283 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 284 | GCC_WARN_UNDECLARED_SELECTOR = YES; 285 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 286 | GCC_WARN_UNUSED_FUNCTION = YES; 287 | GCC_WARN_UNUSED_VARIABLE = YES; 288 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 289 | METAL_ENABLE_DEBUG_INFO = YES; 290 | ONLY_ACTIVE_ARCH = YES; 291 | SDKROOT = iphoneos; 292 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 293 | SWIFT_VERSION = 3.0; 294 | }; 295 | name = Debug; 296 | }; 297 | 2D3818A619469B6D00C0F80C /* Release */ = { 298 | isa = XCBuildConfiguration; 299 | buildSettings = { 300 | ALWAYS_SEARCH_USER_PATHS = NO; 301 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 302 | CLANG_CXX_LIBRARY = "libc++"; 303 | CLANG_ENABLE_MODULES = YES; 304 | CLANG_ENABLE_OBJC_ARC = YES; 305 | CLANG_WARN_BOOL_CONVERSION = YES; 306 | CLANG_WARN_CONSTANT_CONVERSION = YES; 307 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 308 | CLANG_WARN_EMPTY_BODY = YES; 309 | CLANG_WARN_ENUM_CONVERSION = YES; 310 | CLANG_WARN_INFINITE_RECURSION = YES; 311 | CLANG_WARN_INT_CONVERSION = YES; 312 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 313 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 314 | CLANG_WARN_UNREACHABLE_CODE = YES; 315 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 316 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 317 | COPY_PHASE_STRIP = YES; 318 | ENABLE_NS_ASSERTIONS = NO; 319 | ENABLE_STRICT_OBJC_MSGSEND = YES; 320 | GCC_C_LANGUAGE_STANDARD = gnu99; 321 | GCC_NO_COMMON_BLOCKS = YES; 322 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 323 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 324 | GCC_WARN_UNDECLARED_SELECTOR = YES; 325 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 326 | GCC_WARN_UNUSED_FUNCTION = YES; 327 | GCC_WARN_UNUSED_VARIABLE = YES; 328 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 329 | METAL_ENABLE_DEBUG_INFO = NO; 330 | SDKROOT = iphoneos; 331 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 332 | SWIFT_VERSION = 3.0; 333 | VALIDATE_PRODUCT = YES; 334 | }; 335 | name = Release; 336 | }; 337 | 2D3818A819469B6D00C0F80C /* Debug */ = { 338 | isa = XCBuildConfiguration; 339 | buildSettings = { 340 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 341 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 342 | INFOPLIST_FILE = "Swift-Useful-Extensions/Info.plist"; 343 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 344 | PRODUCT_BUNDLE_IDENTIFIER = "com.yin.xu.app.${PRODUCT_NAME:rfc1034identifier}"; 345 | PRODUCT_NAME = "$(TARGET_NAME)"; 346 | }; 347 | name = Debug; 348 | }; 349 | 2D3818A919469B6D00C0F80C /* Release */ = { 350 | isa = XCBuildConfiguration; 351 | buildSettings = { 352 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 353 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 354 | INFOPLIST_FILE = "Swift-Useful-Extensions/Info.plist"; 355 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 356 | PRODUCT_BUNDLE_IDENTIFIER = "com.yin.xu.app.${PRODUCT_NAME:rfc1034identifier}"; 357 | PRODUCT_NAME = "$(TARGET_NAME)"; 358 | }; 359 | name = Release; 360 | }; 361 | 2D3818AB19469B6D00C0F80C /* Debug */ = { 362 | isa = XCBuildConfiguration; 363 | buildSettings = { 364 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Swift-Useful-Extensions.app/Swift-Useful-Extensions"; 365 | FRAMEWORK_SEARCH_PATHS = ( 366 | "$(SDKROOT)/Developer/Library/Frameworks", 367 | "$(inherited)", 368 | ); 369 | GCC_PREPROCESSOR_DEFINITIONS = ( 370 | "DEBUG=1", 371 | "$(inherited)", 372 | ); 373 | INFOPLIST_FILE = "Swift-Useful-ExtensionsTests/Info.plist"; 374 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 375 | METAL_ENABLE_DEBUG_INFO = YES; 376 | PRODUCT_BUNDLE_IDENTIFIER = "com.yin.xu.app.${PRODUCT_NAME:rfc1034identifier}"; 377 | PRODUCT_NAME = "$(TARGET_NAME)"; 378 | TEST_HOST = "$(BUNDLE_LOADER)"; 379 | }; 380 | name = Debug; 381 | }; 382 | 2D3818AC19469B6D00C0F80C /* Release */ = { 383 | isa = XCBuildConfiguration; 384 | buildSettings = { 385 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Swift-Useful-Extensions.app/Swift-Useful-Extensions"; 386 | FRAMEWORK_SEARCH_PATHS = ( 387 | "$(SDKROOT)/Developer/Library/Frameworks", 388 | "$(inherited)", 389 | ); 390 | INFOPLIST_FILE = "Swift-Useful-ExtensionsTests/Info.plist"; 391 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 392 | METAL_ENABLE_DEBUG_INFO = NO; 393 | PRODUCT_BUNDLE_IDENTIFIER = "com.yin.xu.app.${PRODUCT_NAME:rfc1034identifier}"; 394 | PRODUCT_NAME = "$(TARGET_NAME)"; 395 | TEST_HOST = "$(BUNDLE_LOADER)"; 396 | }; 397 | name = Release; 398 | }; 399 | /* End XCBuildConfiguration section */ 400 | 401 | /* Begin XCConfigurationList section */ 402 | 2D38188619469B6D00C0F80C /* Build configuration list for PBXProject "Swift-Useful-Extensions" */ = { 403 | isa = XCConfigurationList; 404 | buildConfigurations = ( 405 | 2D3818A519469B6D00C0F80C /* Debug */, 406 | 2D3818A619469B6D00C0F80C /* Release */, 407 | ); 408 | defaultConfigurationIsVisible = 0; 409 | defaultConfigurationName = Release; 410 | }; 411 | 2D3818A719469B6D00C0F80C /* Build configuration list for PBXNativeTarget "Swift-Useful-Extensions" */ = { 412 | isa = XCConfigurationList; 413 | buildConfigurations = ( 414 | 2D3818A819469B6D00C0F80C /* Debug */, 415 | 2D3818A919469B6D00C0F80C /* Release */, 416 | ); 417 | defaultConfigurationIsVisible = 0; 418 | defaultConfigurationName = Release; 419 | }; 420 | 2D3818AA19469B6D00C0F80C /* Build configuration list for PBXNativeTarget "Swift-Useful-ExtensionsTests" */ = { 421 | isa = XCConfigurationList; 422 | buildConfigurations = ( 423 | 2D3818AB19469B6D00C0F80C /* Debug */, 424 | 2D3818AC19469B6D00C0F80C /* Release */, 425 | ); 426 | defaultConfigurationIsVisible = 0; 427 | defaultConfigurationName = Release; 428 | }; 429 | /* End XCConfigurationList section */ 430 | }; 431 | rootObject = 2D38188319469B6D00C0F80C /* Project object */; 432 | } 433 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions.xcodeproj/project.xcworkspace/xcshareddata/Swift-Useful-Extensions.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | FBF08037-4D58-4303-854A-A0F6E6A4D8BD 9 | IDESourceControlProjectName 10 | Swift-Useful-Extensions 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | D27FAABB93A4157ED5537841525C2FF15078ED1D 14 | https://github.com/yingogobot/Swift-Useful-Extensions.git 15 | 16 | IDESourceControlProjectPath 17 | Swift-Useful-Extensions.xcodeproj/project.xcworkspace 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | D27FAABB93A4157ED5537841525C2FF15078ED1D 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/yingogobot/Swift-Useful-Extensions.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | D27FAABB93A4157ED5537841525C2FF15078ED1D 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | D27FAABB93A4157ED5537841525C2FF15078ED1D 36 | IDESourceControlWCCName 37 | Swift-Extensions 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions.xcodeproj/xcuserdata/Yin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions.xcodeproj/xcuserdata/Yin.xcuserdatad/xcschemes/Swift-Useful-Extensions.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | 73 | 79 | 80 | 86 | 87 | 88 | 89 | 91 | 92 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions.xcodeproj/xcuserdata/Yin.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Swift-Useful-Extensions.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 2D38188A19469B6D00C0F80C 16 | 17 | primary 18 | 19 | 20 | 2D38189C19469B6D00C0F80C 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions.xcodeproj/xcuserdata/adam.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions.xcodeproj/xcuserdata/adam.xcuserdatad/xcschemes/Swift-Useful-Extensions.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions.xcodeproj/xcuserdata/adam.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Swift-Useful-Extensions.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 2D38188A19469B6D00C0F80C 16 | 17 | primary 18 | 19 | 20 | 2D38189C19469B6D00C0F80C 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // AppDelegate.swift 2 | // Swift-Useful-Extensions 3 | 4 | 5 | import UIKit 6 | 7 | @UIApplicationMain 8 | class AppDelegate: UIResponder, UIApplicationDelegate { 9 | 10 | var window: UIWindow? 11 | 12 | 13 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { 14 | // Override point for customization after application launch. 15 | return true 16 | } 17 | 18 | func applicationWillResignActive(application: UIApplication) { 19 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 20 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 21 | } 22 | 23 | func applicationDidEnterBackground(application: UIApplication) { 24 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 25 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 26 | } 27 | 28 | func applicationWillEnterForeground(application: UIApplication) { 29 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 30 | } 31 | 32 | func applicationDidBecomeActive(application: UIApplication) { 33 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 34 | } 35 | 36 | func applicationWillTerminate(application: UIApplication) { 37 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 38 | } 39 | 40 | 41 | } 42 | 43 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | } 43 | ], 44 | "info" : { 45 | "version" : 1, 46 | "author" : "xcode" 47 | } 48 | } -------------------------------------------------------------------------------- /Swift-Useful-Extensions/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Swift-Useful-Extensions/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "extent" : "full-screen", 14 | "minimum-system-version" : "7.0", 15 | "subtype" : "retina4", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Swift-Useful-Extensions/Images.xcassets/avatar.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "avatar.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Swift-Useful-Extensions/Images.xcassets/avatar.imageset/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingogobot/Swift-Useful-Extensions/9d2ac7974188d63713b8c907b3fe98a5b6c5449d/Swift-Useful-Extensions/Images.xcassets/avatar.imageset/avatar.jpg -------------------------------------------------------------------------------- /Swift-Useful-Extensions/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions/UsefulExtensions.swift: -------------------------------------------------------------------------------- 1 | // Useful-Extensions 2 | 3 | 4 | import UIKit 5 | 6 | 7 | //MARK - Int 8 | extension Int{ 9 | var isEven:Bool {return (self % 2 == 0)} 10 | var isOdd:Bool {return (self % 2 != 0)} 11 | var isPositive:Bool {return (self >= 0)} 12 | var isNegative:Bool {return (self < 0)} 13 | var toDouble:Double {return Double(self)} 14 | var toFloat:Float {return Float(self)} 15 | 16 | var digits: Int { 17 | if (self == 0) { 18 | return 1 19 | } else if(Int(fabs(Double(self))) <= LONG_MAX){ 20 | return Int(log10(fabs(Double(self)))) + 1 21 | } else { 22 | print("Out of bounds") 23 | return -1; 24 | } 25 | } 26 | } 27 | 28 | 29 | 30 | //MARK - Double 31 | extension Double { 32 | func roundedTo(decimals: Int) -> Double { 33 | let format = NumberFormatter() 34 | format.numberStyle = NumberFormatter.Style.decimal 35 | format.multiplier = 1 36 | format.roundingMode = .up 37 | format.maximumFractionDigits = decimals 38 | format.number(from: format.string(for: self )! ) 39 | 40 | return (format.number(from: format.string(for: self )! )) as! Double 41 | } 42 | } 43 | 44 | 45 | 46 | //MARK - String 47 | extension String { 48 | 49 | func contains(_ string:String) -> Bool { 50 | if (self.range(of: string) != nil) { 51 | return true 52 | } else { 53 | return false 54 | } 55 | } 56 | 57 | func contains(_ string:String, withCompareOptions compareOptions: NSString.CompareOptions) -> Bool { 58 | if ((self.range(of:string, options: compareOptions)) != nil) { 59 | return true 60 | } else { 61 | return false 62 | } 63 | } 64 | 65 | func reverse() -> String { 66 | return String(self.characters.reversed()) 67 | } 68 | 69 | } 70 | 71 | 72 | 73 | //MARK - UIView 74 | extension UIView { 75 | 76 | var width: CGFloat { 77 | get { 78 | return self.frame.size.width 79 | } 80 | set { 81 | self.frame.size.width = newValue 82 | } 83 | } 84 | 85 | var height: CGFloat { 86 | get { 87 | return self.frame.size.height 88 | } 89 | set { 90 | self.frame.size.height = newValue 91 | } 92 | } 93 | 94 | var size: CGSize { 95 | get { 96 | return self.frame.size 97 | } 98 | set{ 99 | self.frame.size = newValue 100 | } 101 | } 102 | 103 | var origin: CGPoint { 104 | get { 105 | return self.frame.origin 106 | } 107 | set { 108 | self.frame.origin = newValue 109 | } 110 | } 111 | 112 | var x: CGFloat { 113 | get { 114 | return self.frame.origin.x 115 | } 116 | set { 117 | self.frame.origin = CGPoint(x:newValue, y:self.frame.origin.y) 118 | } 119 | } 120 | 121 | var y: CGFloat { 122 | get { 123 | return self.frame.origin.y 124 | } 125 | set { 126 | self.frame.origin = CGPoint(x:self.frame.origin.x, y:newValue) 127 | } 128 | } 129 | 130 | var centerX: CGFloat { 131 | get { 132 | return self.center.x 133 | } 134 | set { 135 | self.center = CGPoint(x:newValue, y:self.center.y) 136 | } 137 | } 138 | 139 | var centerY: CGFloat { 140 | get { 141 | return self.center.y 142 | } 143 | set { 144 | self.center = CGPoint(x:self.center.x, y:newValue) 145 | } 146 | } 147 | 148 | var left: CGFloat { 149 | get { 150 | return self.frame.origin.x 151 | } 152 | set { 153 | self.frame.origin.x = newValue 154 | } 155 | } 156 | 157 | var right: CGFloat { 158 | get { 159 | return self.frame.origin.x + self.frame.size.width 160 | } 161 | set { 162 | self.frame.origin.x = newValue - self.frame.size.width 163 | } 164 | } 165 | var top: CGFloat { 166 | get { 167 | return self.frame.origin.y 168 | } 169 | set { 170 | self.frame.origin.y = newValue 171 | } 172 | } 173 | var bottom: CGFloat { 174 | get { 175 | return self.frame.origin.y + self.frame.size.height 176 | } 177 | set { 178 | self.frame.origin.y = newValue - self.frame.size.height 179 | } 180 | } 181 | 182 | var cornerRadius: CGFloat { 183 | get { 184 | return self.layer.cornerRadius 185 | } 186 | set { 187 | self.layer.masksToBounds = true 188 | self.layer.cornerRadius = newValue 189 | } 190 | } 191 | 192 | } 193 | 194 | 195 | //MARK - NSDate 196 | extension NSDate { 197 | func daysInBetween(_ date: NSDate) -> Double { 198 | var diff = self.timeIntervalSinceNow - date.timeIntervalSinceNow 199 | diff = fabs(diff/86400) 200 | return diff 201 | } 202 | 203 | func hoursInBetween(_ date: NSDate) -> Double { 204 | var diff = self.timeIntervalSinceNow - date.timeIntervalSinceNow 205 | diff = fabs(diff/3600) 206 | return diff 207 | } 208 | 209 | func minutesInBetween(_ date: NSDate) -> Double { 210 | var diff = self.timeIntervalSinceNow - date.timeIntervalSinceNow 211 | diff = fabs(diff/60) 212 | return diff 213 | } 214 | 215 | func secondsInBetween(_ date: NSDate) -> Double { 216 | var diff = self.timeIntervalSinceNow - date.timeIntervalSinceNow 217 | diff = fabs(diff) 218 | return diff 219 | } 220 | } 221 | 222 | 223 | //MARK - UIImageView 224 | extension UIImageView { 225 | func roundImage() { 226 | //height and width should be the same 227 | self.layer.masksToBounds = true 228 | self.layer.cornerRadius = self.frame.size.width / 2 229 | } 230 | } 231 | 232 | 233 | //MARK - UIImage 234 | extension UIImage { 235 | func croppedImage(bound : CGRect) -> UIImage { 236 | let scaledBounds = CGRect(x:bound.origin.x * self.scale, y:bound.origin.y * self.scale, width:bound.size.width * self.scale, height:bound.size.height * self.scale) 237 | let imageRef = cgImage?.cropping(to:scaledBounds) 238 | let croppedImage = UIImage(cgImage: imageRef!, scale: self.scale, orientation: UIImageOrientation.up) 239 | 240 | return croppedImage 241 | } 242 | } 243 | 244 | 245 | -------------------------------------------------------------------------------- /Swift-Useful-Extensions/ViewController.swift: -------------------------------------------------------------------------------- 1 | // ViewController.swift 2 | // Swift-Useful-Extensions 3 | 4 | import UIKit 5 | 6 | class ViewController: UIViewController { 7 | 8 | @IBOutlet var testView : UIView! 9 | 10 | override func viewDidLoad() { 11 | super.viewDidLoad() 12 | 13 | //////////////////////////////////////////////////// 14 | // UIView Extension // 15 | //////////////////////////////////////////////////// 16 | 17 | self.testView.centerX = 250 18 | self.testView.y = 250 19 | self.testView.width = 100 20 | self.testView.height = 100 21 | self.testView.cornerRadius = 5 22 | 23 | 24 | //////////////////////////////////////////////////// 25 | // Int Extension // 26 | //////////////////////////////////////////////////// 27 | 28 | print("\nInt:") 29 | if(111.isEven) 30 | { 31 | print("111 isEven"); 32 | } 33 | else if (111.isOdd) 34 | { 35 | print("111 isOdd"); 36 | } 37 | print("123 to Float: \(123.toFloat)") 38 | print("How many digits are in -2147483647: \((-2147483647).digits)") 39 | print("How many digits are in 2147483647: \(2147483647.digits)") 40 | 41 | 42 | //////////////////////////////////////////////////// 43 | // String Extension // 44 | //////////////////////////////////////////////////// 45 | 46 | print("\nString:") 47 | print("Reverse: \("Hello World".reverse())") 48 | print("'HEEEEEE' contains 'he': \("HEEEEEE".contains("he"))") 49 | print("'HEEEEEE' contains 'he' using caseInsensitive: \("HEEEEEE".contains("he", withCompareOptions: .caseInsensitive))") 50 | 51 | 52 | //////////////////////////////////////////////////// 53 | // NSDate Extension // 54 | //////////////////////////////////////////////////// 55 | 56 | print("\nNSDate:") 57 | let date = NSDate().addingTimeInterval(60 * 60 * 24) 58 | print("Hours in between now: \(date.hoursInBetween(NSDate()))") 59 | print("Minutes in between now: \(date.minutesInBetween(NSDate()))") 60 | let double = (date.minutesInBetween(NSDate())) 61 | 62 | 63 | //////////////////////////////////////////////////// 64 | // Double Extension // 65 | //////////////////////////////////////////////////// 66 | 67 | print("\nDouble:") 68 | print(double.roundedTo(decimals: 2)) 69 | print(5555.5555.roundedTo(decimals: 3)) 70 | print(234.4444.roundedTo(decimals: 1)) 71 | 72 | 73 | //////////////////////////////////////////////////// 74 | // UIImageView Extension // 75 | //////////////////////////////////////////////////// 76 | 77 | let imageView = UIImageView(image: UIImage(named: "avatar")) 78 | imageView.frame = CGRect(x:25, y:50, width:200, height:200) 79 | imageView.roundImage() 80 | self.view.addSubview(imageView) 81 | 82 | 83 | //////////////////////////////////////////////////// 84 | // UIImage Extension // 85 | //////////////////////////////////////////////////// 86 | 87 | let imageView2 = UIImageView(image: UIImage(named: "avatar")) 88 | imageView2.frame = CGRect(x:25, y:250, width:50, height:50) 89 | imageView.contentMode = .scaleAspectFill 90 | self.view.addSubview(imageView2) 91 | 92 | 93 | } 94 | 95 | override func didReceiveMemoryWarning() { 96 | super.didReceiveMemoryWarning() 97 | // Dispose of any resources that can be recreated. 98 | } 99 | 100 | 101 | } 102 | 103 | -------------------------------------------------------------------------------- /Swift-Useful-ExtensionsTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Swift-Useful-ExtensionsTests/Swift_Useful_ExtensionsTests.swift: -------------------------------------------------------------------------------- 1 | // Swift_Useful_ExtensionsTests.swift 2 | // Swift-Useful-ExtensionsTests 3 | 4 | 5 | import XCTest 6 | 7 | class Swift_Useful_ExtensionsTests: XCTestCase { 8 | 9 | override func setUp() { 10 | super.setUp() 11 | // Put setup code here. This method is called before the invocation of each test method in the class. 12 | } 13 | 14 | override func tearDown() { 15 | // Put teardown code here. This method is called after the invocation of each test method in the class. 16 | super.tearDown() 17 | } 18 | 19 | func testExample() { 20 | // This is an example of a functional test case. 21 | XCTAssert(true, "Pass") 22 | } 23 | 24 | func testPerformanceExample() { 25 | // This is an example of a performance test case. 26 | self.measureBlock() { 27 | // Put the code you want to measure the time of here. 28 | } 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | 1.0.1 2 | --------------------------------------------------------------------------------