瀏覽代碼

Merge pull request #77 from kishikawakatsumi/swift-2.0

Swift 2.0
kishikawa katsumi 10 年之前
父節點
當前提交
fb31ae7517

+ 2 - 1
.travis.yml

@@ -1,5 +1,5 @@
 language: objective-c
 language: objective-c
-osx_image: beta-xcode6.3
+osx_image: xcode7
 cache:
 cache:
   directories:
   directories:
     - Lib/vendor/bundle
     - Lib/vendor/bundle
@@ -10,6 +10,7 @@ script:
 branches:
 branches:
   only:
   only:
     - master
     - master
+    - swift-2.0
 env:
 env:
   global:
   global:
     - LANG=en_US.UTF-8
     - LANG=en_US.UTF-8

+ 1 - 0
Examples/Example-iOS/Example-iOS.xcodeproj/project.pbxproj

@@ -162,6 +162,7 @@
 		14DAEE881A51E1BE0070B77E /* Project object */ = {
 		14DAEE881A51E1BE0070B77E /* Project object */ = {
 			isa = PBXProject;
 			isa = PBXProject;
 			attributes = {
 			attributes = {
+				LastSwiftUpdateCheck = 0700;
 				LastUpgradeCheck = 0620;
 				LastUpgradeCheck = 0620;
 				ORGANIZATIONNAME = "kishikawa katsumi";
 				ORGANIZATIONNAME = "kishikawa katsumi";
 				TargetAttributes = {
 				TargetAttributes = {

+ 5 - 2
Examples/Example-iOS/Example-iOS.xcodeproj/xcshareddata/xcschemes/Example-iOS.xcscheme

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
 <Scheme
-   LastUpgradeVersion = "0620"
-   version = "1.8">
+   LastUpgradeVersion = "0700"
+   version = "1.3">
    <BuildAction
    <BuildAction
       parallelizeBuildables = "YES"
       parallelizeBuildables = "YES"
       buildImplicitDependencies = "YES">
       buildImplicitDependencies = "YES">
@@ -62,6 +62,8 @@
             ReferencedContainer = "container:Example-iOS.xcodeproj">
             ReferencedContainer = "container:Example-iOS.xcodeproj">
          </BuildableReference>
          </BuildableReference>
       </MacroExpansion>
       </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
    </TestAction>
    </TestAction>
    <LaunchAction
    <LaunchAction
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
@@ -71,6 +73,7 @@
       buildConfiguration = "Debug"
       buildConfiguration = "Debug"
       ignoresPersistentStateOnLaunch = "NO"
       ignoresPersistentStateOnLaunch = "NO"
       debugDocumentVersioning = "YES"
       debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
       allowLocationSimulation = "YES">
       allowLocationSimulation = "YES">
       <BuildableProductRunnable
       <BuildableProductRunnable
          runnableDebuggingMode = "0">
          runnableDebuggingMode = "0">

+ 1 - 1
Examples/Example-iOS/Example-iOS/AccountsViewController.swift

@@ -51,7 +51,7 @@ class AccountsViewController: UITableViewController {
     }
     }
     
     
     override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
     override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
-        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
+        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 
         
         
         let services = Array(itemsGroupedByService!.keys)
         let services = Array(itemsGroupedByService!.keys)
         let service = services[indexPath.section]
         let service = services[indexPath.section]

+ 17 - 3
Examples/Example-iOS/Example-iOS/InputViewController.swift

@@ -36,14 +36,28 @@ class InputViewController: UITableViewController {
     }
     }
 
 
     @IBAction func saveAction(sender: UIBarButtonItem) {
     @IBAction func saveAction(sender: UIBarButtonItem) {
-        let keychain = Keychain(service: serviceField.text)
-        keychain[usernameField.text] = passwordField.text
+        let keychain: Keychain
+        if let service = serviceField.text where !service.isEmpty {
+            keychain = Keychain(service: service)
+        } else {
+            keychain = Keychain()
+        }
+        keychain[usernameField.text!] = passwordField.text
         
         
         dismissViewControllerAnimated(true, completion: nil)
         dismissViewControllerAnimated(true, completion: nil)
     }
     }
     
     
     @IBAction func editingChanged(sender: UITextField) {
     @IBAction func editingChanged(sender: UITextField) {
-        saveButton.enabled = !usernameField.text.isEmpty && !passwordField.text.isEmpty
+        switch (usernameField.text, passwordField.text) {
+        case let (username?, password?):
+            saveButton.enabled = !username.isEmpty && !password.isEmpty
+        case (_?, nil):
+            saveButton.enabled = false
+        case (nil, _?):
+            saveButton.enabled = false
+        case (nil, nil):
+            saveButton.enabled = false
+        }
     }
     }
 
 
 }
 }

+ 1 - 1
Examples/Playground-iOS.playground/contents.xcplayground

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<playground version='3.0' sdk='iphonesimulator' auto-termination-delay='0'>
+<playground version='3.0' sdk='iphonesimulator' auto-termination-delay='0' runInFullSimulator='YES'>
     <sections>
     <sections>
         <code source-file-name='section-1.swift'/>
         <code source-file-name='section-1.swift'/>
     </sections>
     </sections>

+ 11 - 11
Examples/Playground-iOS.playground/section-1.swift

@@ -62,7 +62,7 @@ keychain.remove("kishikawakatsumi")
 
 
 /* set */
 /* set */
 if let error = keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi") {
 if let error = keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi") {
-    println("error: \(error.localizedDescription)")
+    print("error: \(error.localizedDescription)")
 }
 }
 
 
 /* get */
 /* get */
@@ -72,28 +72,28 @@ let failable = keychain.getStringOrError("kishikawakatsumi")
 // 1. check the enum state
 // 1. check the enum state
 switch failable {
 switch failable {
 case .Success:
 case .Success:
-    println("token: \(failable.value)")
+    print("token: \(failable.value)")
 case .Failure:
 case .Failure:
-    println("error: \(failable.error)")
+    print("error: \(failable.error)")
 }
 }
 
 
 // 2. check the error object
 // 2. check the error object
 if let error = failable.error {
 if let error = failable.error {
-    println("error: \(failable.error)")
+    print("error: \(failable.error)")
 } else {
 } else {
-    println("token: \(failable.value)")
+    print("token: \(failable.value)")
 }
 }
 
 
 // 3. check the failed property
 // 3. check the failed property
 if failable.failed {
 if failable.failed {
-    println("error: \(failable.error)")
+    print("error: \(failable.error)")
 } else {
 } else {
-    println("token: \(failable.value)")
+    print("token: \(failable.value)")
 }
 }
 
 
 /* remove */
 /* remove */
 if let error = keychain.remove("kishikawakatsumi") {
 if let error = keychain.remove("kishikawakatsumi") {
-    println("error: \(error.localizedDescription)")
+    print("error: \(error.localizedDescription)")
 }
 }
 
 
 
 
@@ -143,16 +143,16 @@ keychain
 
 
 /* Display all stored items if print keychain object */
 /* Display all stored items if print keychain object */
 keychain = Keychain(server: NSURL(string: "https://github.com")!, protocolType: .HTTPS)
 keychain = Keychain(server: NSURL(string: "https://github.com")!, protocolType: .HTTPS)
-println("\(keychain)")
+print("\(keychain)")
 
 
 /* Obtaining all stored keys */
 /* Obtaining all stored keys */
 let keys = keychain.allKeys()
 let keys = keychain.allKeys()
 for key in keys {
 for key in keys {
-    println("key: \(key)")
+    print("key: \(key)")
 }
 }
 
 
 /* Obtaining all stored items */
 /* Obtaining all stored items */
 let items = keychain.allItems()
 let items = keychain.allItems()
 for item in items {
 for item in items {
-    println("item: \(item)")
+    print("item: \(item)")
 }
 }

+ 2 - 1
KeychainAccess.podspec

@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
 Pod::Spec.new do |s|
   s.name             = "KeychainAccess"
   s.name             = "KeychainAccess"
-  s.version          = "1.2.1"
+  s.version          = "2.0.0"
   s.summary          = "KeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X."
   s.summary          = "KeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X."
   s.description      = <<-DESC
   s.description      = <<-DESC
                          KeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X.
                          KeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X.
@@ -24,6 +24,7 @@ Pod::Spec.new do |s|
 
 
   s.ios.deployment_target = "8.0"
   s.ios.deployment_target = "8.0"
   s.osx.deployment_target = "10.9"
   s.osx.deployment_target = "10.9"
+  s.watchos.deployment_target = '2.0'
   s.requires_arc = true
   s.requires_arc = true
 
 
   s.source_files = 'Lib/KeychainAccess/*.swift'
   s.source_files = 'Lib/KeychainAccess/*.swift'

+ 123 - 11
Lib/KeychainAccess.xcodeproj/project.pbxproj

@@ -15,6 +15,8 @@
 		140F196F1A49D79500B0016A /* KeychainAccessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 140F196E1A49D79500B0016A /* KeychainAccessTests.swift */; };
 		140F196F1A49D79500B0016A /* KeychainAccessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 140F196E1A49D79500B0016A /* KeychainAccessTests.swift */; };
 		140F197B1A49D89200B0016A /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 140F197A1A49D89200B0016A /* Keychain.swift */; };
 		140F197B1A49D89200B0016A /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 140F197A1A49D89200B0016A /* Keychain.swift */; };
 		142852A71B1CED3500F27BD9 /* KeychainAccess.h in Headers */ = {isa = PBXBuildFile; fileRef = 140F19611A49D79400B0016A /* KeychainAccess.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		142852A71B1CED3500F27BD9 /* KeychainAccess.h in Headers */ = {isa = PBXBuildFile; fileRef = 140F19611A49D79400B0016A /* KeychainAccess.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		14FDD4681B49B9EF00C39FE8 /* KeychainAccess.h in Headers */ = {isa = PBXBuildFile; fileRef = 140F19611A49D79400B0016A /* KeychainAccess.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		14FDD4691B49BA0200C39FE8 /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 140F197A1A49D89200B0016A /* Keychain.swift */; };
 /* End PBXBuildFile section */
 /* End PBXBuildFile section */
 
 
 /* Begin PBXContainerItemProxy section */
 /* Begin PBXContainerItemProxy section */
@@ -44,6 +46,7 @@
 		140F196D1A49D79500B0016A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		140F196D1A49D79500B0016A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		140F196E1A49D79500B0016A /* KeychainAccessTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainAccessTests.swift; sourceTree = "<group>"; };
 		140F196E1A49D79500B0016A /* KeychainAccessTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainAccessTests.swift; sourceTree = "<group>"; };
 		140F197A1A49D89200B0016A /* Keychain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keychain.swift; sourceTree = "<group>"; };
 		140F197A1A49D89200B0016A /* Keychain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keychain.swift; sourceTree = "<group>"; };
+		14FDD4601B49B9AD00C39FE8 /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 /* End PBXFileReference section */
 
 
 /* Begin PBXFrameworksBuildPhase section */
 /* Begin PBXFrameworksBuildPhase section */
@@ -77,6 +80,13 @@
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
+		14FDD45C1B49B9AD00C39FE8 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXFrameworksBuildPhase section */
 /* End PBXFrameworksBuildPhase section */
 
 
 /* Begin PBXGroup section */
 /* Begin PBXGroup section */
@@ -96,6 +106,7 @@
 				140F19671A49D79500B0016A /* KeychainAccess-iOSTests.xctest */,
 				140F19671A49D79500B0016A /* KeychainAccess-iOSTests.xctest */,
 				140C8F0A1A4EBE3100F85556 /* KeychainAccess.framework */,
 				140C8F0A1A4EBE3100F85556 /* KeychainAccess.framework */,
 				140C8F141A4EBE3100F85556 /* KeychainAccess-MacTests.xctest */,
 				140C8F141A4EBE3100F85556 /* KeychainAccess-MacTests.xctest */,
+				14FDD4601B49B9AD00C39FE8 /* KeychainAccess.framework */,
 			);
 			);
 			name = Products;
 			name = Products;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -154,6 +165,14 @@
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
+		14FDD45D1B49B9AD00C39FE8 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				14FDD4681B49B9EF00C39FE8 /* KeychainAccess.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXHeadersBuildPhase section */
 /* End PBXHeadersBuildPhase section */
 
 
 /* Begin PBXNativeTarget section */
 /* Begin PBXNativeTarget section */
@@ -229,13 +248,32 @@
 			productReference = 140F19671A49D79500B0016A /* KeychainAccess-iOSTests.xctest */;
 			productReference = 140F19671A49D79500B0016A /* KeychainAccess-iOSTests.xctest */;
 			productType = "com.apple.product-type.bundle.unit-test";
 			productType = "com.apple.product-type.bundle.unit-test";
 		};
 		};
+		14FDD45F1B49B9AD00C39FE8 /* KeychainAccess-watchOS */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 14FDD4671B49B9AD00C39FE8 /* Build configuration list for PBXNativeTarget "KeychainAccess-watchOS" */;
+			buildPhases = (
+				14FDD45B1B49B9AD00C39FE8 /* Sources */,
+				14FDD45C1B49B9AD00C39FE8 /* Frameworks */,
+				14FDD45D1B49B9AD00C39FE8 /* Headers */,
+				14FDD45E1B49B9AD00C39FE8 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "KeychainAccess-watchOS";
+			productName = "KeychainAccess-watchOS";
+			productReference = 14FDD4601B49B9AD00C39FE8 /* KeychainAccess.framework */;
+			productType = "com.apple.product-type.framework";
+		};
 /* End PBXNativeTarget section */
 /* End PBXNativeTarget section */
 
 
 /* Begin PBXProject section */
 /* Begin PBXProject section */
 		140F19531A49D79400B0016A /* Project object */ = {
 		140F19531A49D79400B0016A /* Project object */ = {
 			isa = PBXProject;
 			isa = PBXProject;
 			attributes = {
 			attributes = {
-				LastUpgradeCheck = 0610;
+				LastSwiftUpdateCheck = 0700;
+				LastUpgradeCheck = 0700;
 				ORGANIZATIONNAME = "kishikawa katsumi";
 				ORGANIZATIONNAME = "kishikawa katsumi";
 				TargetAttributes = {
 				TargetAttributes = {
 					140C8F091A4EBE3100F85556 = {
 					140C8F091A4EBE3100F85556 = {
@@ -250,6 +288,9 @@
 					140F19661A49D79500B0016A = {
 					140F19661A49D79500B0016A = {
 						CreatedOnToolsVersion = 6.1.1;
 						CreatedOnToolsVersion = 6.1.1;
 					};
 					};
+					14FDD45F1B49B9AD00C39FE8 = {
+						CreatedOnToolsVersion = 7.0;
+					};
 				};
 				};
 			};
 			};
 			buildConfigurationList = 140F19561A49D79400B0016A /* Build configuration list for PBXProject "KeychainAccess" */;
 			buildConfigurationList = 140F19561A49D79400B0016A /* Build configuration list for PBXProject "KeychainAccess" */;
@@ -268,6 +309,7 @@
 				140F19661A49D79500B0016A /* KeychainAccess-iOSTests */,
 				140F19661A49D79500B0016A /* KeychainAccess-iOSTests */,
 				140C8F091A4EBE3100F85556 /* KeychainAccess-Mac */,
 				140C8F091A4EBE3100F85556 /* KeychainAccess-Mac */,
 				140C8F131A4EBE3100F85556 /* KeychainAccess-MacTests */,
 				140C8F131A4EBE3100F85556 /* KeychainAccess-MacTests */,
+				14FDD45F1B49B9AD00C39FE8 /* KeychainAccess-watchOS */,
 			);
 			);
 		};
 		};
 /* End PBXProject section */
 /* End PBXProject section */
@@ -301,6 +343,13 @@
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
+		14FDD45E1B49B9AD00C39FE8 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXResourcesBuildPhase section */
 /* End PBXResourcesBuildPhase section */
 
 
 /* Begin PBXSourcesBuildPhase section */
 /* Begin PBXSourcesBuildPhase section */
@@ -336,6 +385,14 @@
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
+		14FDD45B1B49B9AD00C39FE8 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				14FDD4691B49BA0200C39FE8 /* Keychain.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 /* End PBXSourcesBuildPhase section */
 /* End PBXSourcesBuildPhase section */
 
 
 /* Begin PBXTargetDependency section */
 /* Begin PBXTargetDependency section */
@@ -370,6 +427,7 @@
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
+				PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(PROJECT_NAME)";
 				PRODUCT_NAME = "$(PROJECT_NAME)";
 				SDKROOT = macosx;
 				SDKROOT = macosx;
 				SKIP_INSTALL = YES;
 				SKIP_INSTALL = YES;
@@ -391,6 +449,7 @@
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
+				PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(PROJECT_NAME)";
 				PRODUCT_NAME = "$(PROJECT_NAME)";
 				SDKROOT = macosx;
 				SDKROOT = macosx;
 				SKIP_INSTALL = YES;
 				SKIP_INSTALL = YES;
@@ -413,6 +472,7 @@
 				INFOPLIST_FILE = KeychainAccessTests/Info.plist;
 				INFOPLIST_FILE = KeychainAccessTests/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
+				PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SDKROOT = macosx;
 				SDKROOT = macosx;
 			};
 			};
@@ -431,6 +491,7 @@
 				INFOPLIST_FILE = KeychainAccessTests/Info.plist;
 				INFOPLIST_FILE = KeychainAccessTests/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
 				MACOSX_DEPLOYMENT_TARGET = 10.9;
+				PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SDKROOT = macosx;
 				SDKROOT = macosx;
 			};
 			};
@@ -440,7 +501,6 @@
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
 			buildSettings = {
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				ALWAYS_SEARCH_USER_PATHS = NO;
-				APPLICATION_EXTENSION_API_ONLY = YES;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_MODULES = YES;
@@ -458,6 +518,7 @@
 				COPY_PHASE_STRIP = NO;
 				COPY_PHASE_STRIP = NO;
 				CURRENT_PROJECT_VERSION = 1;
 				CURRENT_PROJECT_VERSION = 1;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_OPTIMIZATION_LEVEL = 0;
@@ -487,7 +548,6 @@
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
 			buildSettings = {
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				ALWAYS_SEARCH_USER_PATHS = NO;
-				APPLICATION_EXTENSION_API_ONLY = YES;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_MODULES = YES;
@@ -535,6 +595,7 @@
 				INFOPLIST_FILE = KeychainAccess/Info.plist;
 				INFOPLIST_FILE = KeychainAccess/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(PROJECT_NAME)";
 				PRODUCT_NAME = "$(PROJECT_NAME)";
 				SKIP_INSTALL = YES;
 				SKIP_INSTALL = YES;
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -553,6 +614,7 @@
 				INFOPLIST_FILE = KeychainAccess/Info.plist;
 				INFOPLIST_FILE = KeychainAccess/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(PROJECT_NAME)";
 				PRODUCT_NAME = "$(PROJECT_NAME)";
 				SKIP_INSTALL = YES;
 				SKIP_INSTALL = YES;
 			};
 			};
@@ -562,16 +624,14 @@
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
 			buildSettings = {
 			buildSettings = {
 				APPLICATION_EXTENSION_API_ONLY = NO;
 				APPLICATION_EXTENSION_API_ONLY = NO;
-				FRAMEWORK_SEARCH_PATHS = (
-					"$(SDKROOT)/Developer/Library/Frameworks",
-					"$(inherited)",
-				);
+				FRAMEWORK_SEARCH_PATHS = "$(inherited)";
 				GCC_PREPROCESSOR_DEFINITIONS = (
 				GCC_PREPROCESSOR_DEFINITIONS = (
 					"DEBUG=1",
 					"DEBUG=1",
 					"$(inherited)",
 					"$(inherited)",
 				);
 				);
 				INFOPLIST_FILE = KeychainAccessTests/Info.plist;
 				INFOPLIST_FILE = KeychainAccessTests/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 			};
 			};
 			name = Debug;
 			name = Debug;
@@ -580,16 +640,59 @@
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
 			buildSettings = {
 			buildSettings = {
 				APPLICATION_EXTENSION_API_ONLY = NO;
 				APPLICATION_EXTENSION_API_ONLY = NO;
-				FRAMEWORK_SEARCH_PATHS = (
-					"$(SDKROOT)/Developer/Library/Frameworks",
-					"$(inherited)",
-				);
+				FRAMEWORK_SEARCH_PATHS = "$(inherited)";
 				INFOPLIST_FILE = KeychainAccessTests/Info.plist;
 				INFOPLIST_FILE = KeychainAccessTests/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 			};
 			};
 			name = Release;
 			name = Release;
 		};
 		};
+		14FDD4651B49B9AD00C39FE8 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				APPLICATION_EXTENSION_API_ONLY = YES;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				GCC_NO_COMMON_BLOCKS = YES;
+				INFOPLIST_FILE = KeychainAccess/Info.plist;
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.KeychainAccess-watchOS";
+				PRODUCT_NAME = "$(PROJECT_NAME)";
+				SDKROOT = watchos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 2.0;
+			};
+			name = Debug;
+		};
+		14FDD4661B49B9AD00C39FE8 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				APPLICATION_EXTENSION_API_ONLY = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				DEFINES_MODULE = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				GCC_NO_COMMON_BLOCKS = YES;
+				INFOPLIST_FILE = KeychainAccess/Info.plist;
+				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+				PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.KeychainAccess-watchOS";
+				PRODUCT_NAME = "$(PROJECT_NAME)";
+				SDKROOT = watchos;
+				SKIP_INSTALL = YES;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 2.0;
+			};
+			name = Release;
+		};
 /* End XCBuildConfiguration section */
 /* End XCBuildConfiguration section */
 
 
 /* Begin XCConfigurationList section */
 /* Begin XCConfigurationList section */
@@ -638,6 +741,15 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 			defaultConfigurationName = Release;
 		};
 		};
+		14FDD4671B49B9AD00C39FE8 /* Build configuration list for PBXNativeTarget "KeychainAccess-watchOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				14FDD4651B49B9AD00C39FE8 /* Debug */,
+				14FDD4661B49B9AD00C39FE8 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
 /* End XCConfigurationList section */
 /* End XCConfigurationList section */
 	};
 	};
 	rootObject = 140F19531A49D79400B0016A /* Project object */;
 	rootObject = 140F19531A49D79400B0016A /* Project object */;

+ 4 - 1
Lib/KeychainAccess.xcodeproj/xcshareddata/xcschemes/KeychainAccess-Mac.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
 <Scheme
-   LastUpgradeVersion = "0610"
+   LastUpgradeVersion = "0700"
    version = "1.3">
    version = "1.3">
    <BuildAction
    <BuildAction
       parallelizeBuildables = "YES"
       parallelizeBuildables = "YES"
@@ -62,6 +62,8 @@
             ReferencedContainer = "container:KeychainAccess.xcodeproj">
             ReferencedContainer = "container:KeychainAccess.xcodeproj">
          </BuildableReference>
          </BuildableReference>
       </MacroExpansion>
       </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
    </TestAction>
    </TestAction>
    <LaunchAction
    <LaunchAction
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
@@ -71,6 +73,7 @@
       buildConfiguration = "Debug"
       buildConfiguration = "Debug"
       ignoresPersistentStateOnLaunch = "NO"
       ignoresPersistentStateOnLaunch = "NO"
       debugDocumentVersioning = "YES"
       debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
       allowLocationSimulation = "YES">
       allowLocationSimulation = "YES">
       <MacroExpansion>
       <MacroExpansion>
          <BuildableReference
          <BuildableReference

+ 8 - 4
Lib/KeychainAccess.xcodeproj/xcshareddata/xcschemes/KeychainAccess-iOS.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
 <Scheme
-   LastUpgradeVersion = "0610"
+   LastUpgradeVersion = "0700"
    version = "1.3">
    version = "1.3">
    <BuildAction
    <BuildAction
       parallelizeBuildables = "YES"
       parallelizeBuildables = "YES"
@@ -37,10 +37,11 @@
       </BuildActionEntries>
       </BuildActionEntries>
    </BuildAction>
    </BuildAction>
    <TestAction
    <TestAction
+      buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       shouldUseLaunchSchemeArgsEnv = "YES"
       shouldUseLaunchSchemeArgsEnv = "YES"
-      buildConfiguration = "Debug">
+      codeCoverageEnabled = "YES">
       <Testables>
       <Testables>
          <TestableReference
          <TestableReference
             skipped = "NO">
             skipped = "NO">
@@ -62,15 +63,18 @@
             ReferencedContainer = "container:KeychainAccess.xcodeproj">
             ReferencedContainer = "container:KeychainAccess.xcodeproj">
          </BuildableReference>
          </BuildableReference>
       </MacroExpansion>
       </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
    </TestAction>
    </TestAction>
    <LaunchAction
    <LaunchAction
+      buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       launchStyle = "0"
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       useCustomWorkingDirectory = "NO"
-      buildConfiguration = "Debug"
       ignoresPersistentStateOnLaunch = "NO"
       ignoresPersistentStateOnLaunch = "NO"
       debugDocumentVersioning = "YES"
       debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
       allowLocationSimulation = "YES">
       allowLocationSimulation = "YES">
       <MacroExpansion>
       <MacroExpansion>
          <BuildableReference
          <BuildableReference
@@ -85,10 +89,10 @@
       </AdditionalOptions>
       </AdditionalOptions>
    </LaunchAction>
    </LaunchAction>
    <ProfileAction
    <ProfileAction
+      buildConfiguration = "Release"
       shouldUseLaunchSchemeArgsEnv = "YES"
       shouldUseLaunchSchemeArgsEnv = "YES"
       savedToolIdentifier = ""
       savedToolIdentifier = ""
       useCustomWorkingDirectory = "NO"
       useCustomWorkingDirectory = "NO"
-      buildConfiguration = "Release"
       debugDocumentVersioning = "YES">
       debugDocumentVersioning = "YES">
       <MacroExpansion>
       <MacroExpansion>
          <BuildableReference
          <BuildableReference

+ 80 - 0
Lib/KeychainAccess.xcodeproj/xcshareddata/xcschemes/KeychainAccess-watchOS.xcscheme

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0700"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "14FDD45F1B49B9AD00C39FE8"
+               BuildableName = "KeychainAccess.framework"
+               BlueprintName = "KeychainAccess-watchOS"
+               ReferencedContainer = "container:KeychainAccess.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      buildConfiguration = "Debug">
+      <Testables>
+      </Testables>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </TestAction>
+   <LaunchAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Debug"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "14FDD45F1B49B9AD00C39FE8"
+            BuildableName = "KeychainAccess.framework"
+            BlueprintName = "KeychainAccess-watchOS"
+            ReferencedContainer = "container:KeychainAccess.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Release"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "14FDD45F1B49B9AD00C39FE8"
+            BuildableName = "KeychainAccess.framework"
+            BlueprintName = "KeychainAccess-watchOS"
+            ReferencedContainer = "container:KeychainAccess.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 2 - 2
Lib/KeychainAccess/Info.plist

@@ -7,7 +7,7 @@
 	<key>CFBundleExecutable</key>
 	<key>CFBundleExecutable</key>
 	<string>$(EXECUTABLE_NAME)</string>
 	<string>$(EXECUTABLE_NAME)</string>
 	<key>CFBundleIdentifier</key>
 	<key>CFBundleIdentifier</key>
-	<string>com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)</string>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
 	<key>CFBundleInfoDictionaryVersion</key>
 	<key>CFBundleInfoDictionaryVersion</key>
 	<string>6.0</string>
 	<string>6.0</string>
 	<key>CFBundleName</key>
 	<key>CFBundleName</key>
@@ -15,7 +15,7 @@
 	<key>CFBundlePackageType</key>
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
 	<key>CFBundleShortVersionString</key>
-	<string>1.2.1</string>
+	<string>2.0.0</string>
 	<key>CFBundleSignature</key>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<string>????</string>
 	<key>CFBundleVersion</key>
 	<key>CFBundleVersion</key>

文件差異過大導致無法顯示
+ 240 - 336
Lib/KeychainAccess/Keychain.swift


+ 1 - 1
Lib/KeychainAccessTests/Info.plist

@@ -7,7 +7,7 @@
 	<key>CFBundleExecutable</key>
 	<key>CFBundleExecutable</key>
 	<string>$(EXECUTABLE_NAME)</string>
 	<string>$(EXECUTABLE_NAME)</string>
 	<key>CFBundleIdentifier</key>
 	<key>CFBundleIdentifier</key>
-	<string>com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)</string>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
 	<key>CFBundleInfoDictionaryVersion</key>
 	<key>CFBundleInfoDictionaryVersion</key>
 	<string>6.0</string>
 	<string>6.0</string>
 	<key>CFBundleName</key>
 	<key>CFBundleName</key>

+ 275 - 324
Lib/KeychainAccessTests/KeychainAccessTests.swift

@@ -15,68 +15,64 @@ class KeychainAccessTests: XCTestCase {
     
     
     override func setUp() {
     override func setUp() {
         super.setUp()
         super.setUp()
+
+        do { try Keychain(service: "Twitter", accessGroup: "12ABCD3E4F.shared").removeAll() } catch {}
+        do { try Keychain(service: "Twitter").removeAll() } catch {}
         
         
-        Keychain(service: "Twitter", accessGroup: "12ABCD3E4F.shared").removeAll()
-        Keychain(service: "Twitter").removeAll()
-        
-        Keychain(server: NSURL(string: "https://example.com")!, protocolType: .HTTPS).removeAll()
+        do { try Keychain(server: NSURL(string: "https://example.com")!, protocolType: .HTTPS).removeAll() } catch {}
         
         
-        Keychain().removeAll()
+        do { try Keychain().removeAll() } catch {}
     }
     }
     
     
     override func tearDown() {
     override func tearDown() {
         super.tearDown()
         super.tearDown()
     }
     }
     
     
-    func locally(x: () -> ()) {
-        x()
-    }
-    
     // MARK:
     // MARK:
     
     
     func testGenericPassword() {
     func testGenericPassword() {
-        locally {
+        do {
             // Add Keychain items
             // Add Keychain items
             let keychain = Keychain(service: "Twitter")
             let keychain = Keychain(service: "Twitter")
             
             
-            keychain.set("kishikawa_katsumi", key: "username")
-            keychain.set("password_1234", key: "password")
+            do { try keychain.set("kishikawa_katsumi", key: "username") } catch {}
+            do { try keychain.set("password_1234", key: "password") } catch {}
             
             
-            let username = keychain.get("username")
+            let username = try! keychain.get("username")
             XCTAssertEqual(username!, "kishikawa_katsumi")
             XCTAssertEqual(username!, "kishikawa_katsumi")
             
             
-            let password = keychain.get("password")
+            let password = try! keychain.get("password")
             XCTAssertEqual(password!, "password_1234")
             XCTAssertEqual(password!, "password_1234")
         }
         }
         
         
-        locally {
+        do {
             // Update Keychain items
             // Update Keychain items
             let keychain = Keychain(service: "Twitter")
             let keychain = Keychain(service: "Twitter")
             
             
-            keychain.set("katsumi_kishikawa", key: "username")
-            keychain.set("1234_password", key: "password")
+            do { try keychain.set("katsumi_kishikawa", key: "username") } catch {}
+            do { try keychain.set("1234_password", key: "password") } catch {}
             
             
-            let username = keychain.get("username")
+            let username = try! keychain.get("username")
             XCTAssertEqual(username!, "katsumi_kishikawa")
             XCTAssertEqual(username!, "katsumi_kishikawa")
             
             
-            let password = keychain.get("password")
+            let password = try! keychain.get("password")
             XCTAssertEqual(password!, "1234_password")
             XCTAssertEqual(password!, "1234_password")
         }
         }
         
         
-        locally {
+        do {
             // Remove Keychain items
             // Remove Keychain items
             let keychain = Keychain(service: "Twitter")
             let keychain = Keychain(service: "Twitter")
             
             
-            keychain.remove("username")
-            keychain.remove("password")
+            do { try keychain.remove("username") } catch {}
+            do { try keychain.remove("password") } catch {}
             
             
-            XCTAssertNil(keychain.get("username"))
-            XCTAssertNil(keychain.get("password"))
+            XCTAssertNil(try! keychain.get("username"))
+            XCTAssertNil(try! keychain.get("password"))
         }
         }
     }
     }
     
     
     func testGenericPasswordSubscripting() {
     func testGenericPasswordSubscripting() {
-        locally {
+        do {
             // Add Keychain items
             // Add Keychain items
             let keychain = Keychain(service: "Twitter", accessGroup: "12ABCD3E4F.shared")
             let keychain = Keychain(service: "Twitter", accessGroup: "12ABCD3E4F.shared")
             
             
@@ -90,7 +86,7 @@ class KeychainAccessTests: XCTestCase {
             XCTAssertEqual(password!, "password_1234")
             XCTAssertEqual(password!, "password_1234")
         }
         }
         
         
-        locally {
+        do {
             // Update Keychain items
             // Update Keychain items
             let keychain = Keychain(service: "Twitter", accessGroup: "12ABCD3E4F.shared")
             let keychain = Keychain(service: "Twitter", accessGroup: "12ABCD3E4F.shared")
             
             
@@ -104,7 +100,7 @@ class KeychainAccessTests: XCTestCase {
             XCTAssertEqual(password!, "1234_password")
             XCTAssertEqual(password!, "1234_password")
         }
         }
         
         
-        locally {
+        do {
             // Remove Keychain items
             // Remove Keychain items
             let keychain = Keychain(service: "Twitter", accessGroup: "12ABCD3E4F.shared")
             let keychain = Keychain(service: "Twitter", accessGroup: "12ABCD3E4F.shared")
             
             
@@ -119,48 +115,48 @@ class KeychainAccessTests: XCTestCase {
     // MARK:
     // MARK:
     
     
     func testInternetPassword() {
     func testInternetPassword() {
-        locally {
+        do {
             // Add Keychain items
             // Add Keychain items
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             
             
-            keychain.set("kishikawa_katsumi", key: "username")
-            keychain.set("password_1234", key: "password")
+            do { try keychain.set("kishikawa_katsumi", key: "username") } catch {}
+            do { try keychain.set("password_1234", key: "password") } catch {}
             
             
-            let username = keychain.get("username")
+            let username = try! keychain.get("username")
             XCTAssertEqual(username!, "kishikawa_katsumi")
             XCTAssertEqual(username!, "kishikawa_katsumi")
             
             
-            let password = keychain.get("password")
+            let password = try! keychain.get("password")
             XCTAssertEqual(password!, "password_1234")
             XCTAssertEqual(password!, "password_1234")
         }
         }
         
         
-        locally {
+        do {
             // Update Keychain items
             // Update Keychain items
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             
             
-            keychain.set("katsumi_kishikawa", key: "username")
-            keychain.set("1234_password", key: "password")
+            do { try keychain.set("katsumi_kishikawa", key: "username") } catch {}
+            do { try keychain.set("1234_password", key: "password") } catch {}
             
             
-            let username = keychain.get("username")
+            let username = try! keychain.get("username")
             XCTAssertEqual(username!, "katsumi_kishikawa")
             XCTAssertEqual(username!, "katsumi_kishikawa")
             
             
-            let password = keychain.get("password")
+            let password = try! keychain.get("password")
             XCTAssertEqual(password!, "1234_password")
             XCTAssertEqual(password!, "1234_password")
         }
         }
         
         
-        locally {
+        do {
             // Remove Keychain items
             // Remove Keychain items
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             
             
-            keychain.remove("username")
-            keychain.remove("password")
+            do { try keychain.remove("username") } catch {}
+            do { try keychain.remove("password") } catch {}
             
             
-            XCTAssertNil(keychain.get("username"))
-            XCTAssertNil(keychain.get("password"))
+            XCTAssertNil(try! keychain.get("username"))
+            XCTAssertNil(try! keychain.get("password"))
         }
         }
     }
     }
     
     
     func testInternetPasswordSubscripting() {
     func testInternetPasswordSubscripting() {
-        locally {
+        do {
             // Add Keychain items
             // Add Keychain items
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             
             
@@ -174,7 +170,7 @@ class KeychainAccessTests: XCTestCase {
             XCTAssertEqual(password!, "password_1234")
             XCTAssertEqual(password!, "password_1234")
         }
         }
         
         
-        locally {
+        do {
             // Update Keychain items
             // Update Keychain items
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             
             
@@ -188,7 +184,7 @@ class KeychainAccessTests: XCTestCase {
             XCTAssertEqual(password!, "1234_password")
             XCTAssertEqual(password!, "1234_password")
         }
         }
         
         
-        locally {
+        do {
             // Remove Keychain items
             // Remove Keychain items
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
             
             
@@ -249,16 +245,16 @@ class KeychainAccessTests: XCTestCase {
     func testContains() {
     func testContains() {
         let keychain = Keychain(service: "Twitter")
         let keychain = Keychain(service: "Twitter")
         
         
-        XCTAssertFalse(keychain.contains("username"), "not stored username")
-        XCTAssertFalse(keychain.contains("password"), "not stored password")
+        XCTAssertFalse(try! keychain.contains("username"), "not stored username")
+        XCTAssertFalse(try! keychain.contains("password"), "not stored password")
         
         
-        keychain.set("kishikawakatsumi", key: "username")
-        XCTAssertTrue(keychain.contains("username"), "stored username")
-        XCTAssertFalse(keychain.contains("password"), "not stored password")
+        do { try keychain.set("kishikawakatsumi", key: "username") } catch {}
+        XCTAssertTrue(try! keychain.contains("username"), "stored username")
+        XCTAssertFalse(try! keychain.contains("password"), "not stored password")
         
         
-        keychain.set("password1234", key: "password")
-        XCTAssertTrue(keychain.contains("username"), "stored username")
-        XCTAssertTrue(keychain.contains("password"), "stored password")
+        do { try keychain.set("password1234", key: "password") } catch {}
+        XCTAssertTrue(try! keychain.contains("username"), "stored username")
+        XCTAssertTrue(try! keychain.contains("password"), "stored password")
     }
     }
     
     
     // MARK:
     // MARK:
@@ -266,64 +262,64 @@ class KeychainAccessTests: XCTestCase {
     func testSetString() {
     func testSetString() {
         let keychain = Keychain(service: "Twitter")
         let keychain = Keychain(service: "Twitter")
         
         
-        XCTAssertNil(keychain.get("username"), "not stored username")
-        XCTAssertNil(keychain.get("password"), "not stored password")
+        XCTAssertNil(try! keychain.get("username"), "not stored username")
+        XCTAssertNil(try! keychain.get("password"), "not stored password")
         
         
-        keychain.set("kishikawakatsumi", key: "username")
-        XCTAssertEqual(keychain.get("username")!, "kishikawakatsumi", "stored username")
-        XCTAssertNil(keychain.get("password"), "not stored password")
+        do { try keychain.set("kishikawakatsumi", key: "username") } catch {}
+        XCTAssertEqual(try! keychain.get("username")!, "kishikawakatsumi", "stored username")
+        XCTAssertNil(try! keychain.get("password"), "not stored password")
         
         
-        keychain.set("password1234", key: "password")
-        XCTAssertEqual(keychain.get("username")!, "kishikawakatsumi", "stored username")
-        XCTAssertEqual(keychain.get("password")!, "password1234", "stored password")
+        do { try keychain.set("password1234", key: "password") } catch {}
+        XCTAssertEqual(try! keychain.get("username")!, "kishikawakatsumi", "stored username")
+        XCTAssertEqual(try! keychain.get("password")!, "password1234", "stored password")
     }
     }
     
     
     func testSetData() {
     func testSetData() {
         let JSONObject = ["username": "kishikawakatsumi", "password": "password1234"]
         let JSONObject = ["username": "kishikawakatsumi", "password": "password1234"]
-        let JSONData = NSJSONSerialization.dataWithJSONObject(JSONObject, options: nil, error: nil)
+        let JSONData = try! NSJSONSerialization.dataWithJSONObject(JSONObject, options: [])
         
         
         let keychain = Keychain(service: "Twitter")
         let keychain = Keychain(service: "Twitter")
         
         
-        XCTAssertNil(keychain.getData("JSONData"), "not stored JSON data")
+        XCTAssertNil(try! keychain.getData("JSONData"), "not stored JSON data")
         
         
-        keychain.set(JSONData!, key: "JSONData")
-        XCTAssertEqual(keychain.getData("JSONData")!, JSONData!, "stored JSON data")
+        do { try keychain.set(JSONData, key: "JSONData") } catch {}
+        XCTAssertEqual(try! keychain.getData("JSONData")!, JSONData, "stored JSON data")
     }
     }
     
     
     func testRemoveString() {
     func testRemoveString() {
         let keychain = Keychain(service: "Twitter")
         let keychain = Keychain(service: "Twitter")
         
         
-        XCTAssertNil(keychain.get("username"), "not stored username")
-        XCTAssertNil(keychain.get("password"), "not stored password")
+        XCTAssertNil(try! keychain.get("username"), "not stored username")
+        XCTAssertNil(try! keychain.get("password"), "not stored password")
         
         
-        keychain.set("kishikawakatsumi", key: "username")
-        XCTAssertEqual(keychain.get("username")!, "kishikawakatsumi", "stored username")
+        do { try keychain.set("kishikawakatsumi", key: "username") } catch {}
+        XCTAssertEqual(try! keychain.get("username")!, "kishikawakatsumi", "stored username")
         
         
-        keychain.set("password1234", key: "password")
-        XCTAssertEqual(keychain.get("password")!, "password1234", "stored password")
+        do { try keychain.set("password1234", key: "password") } catch {}
+        XCTAssertEqual(try! keychain.get("password")!, "password1234", "stored password")
         
         
-        keychain.remove("username")
-        XCTAssertNil(keychain.get("username"), "removed username")
-        XCTAssertEqual(keychain.get("password")!, "password1234", "left password")
+        do { try keychain.remove("username") } catch {}
+        XCTAssertNil(try! keychain.get("username"), "removed username")
+        XCTAssertEqual(try! keychain.get("password")!, "password1234", "left password")
         
         
-        keychain.remove("password")
-        XCTAssertNil(keychain.get("username"), "removed username")
-        XCTAssertNil(keychain.get("password"), "removed password")
+        do { try keychain.remove("password") } catch {}
+        XCTAssertNil(try! keychain.get("username"), "removed username")
+        XCTAssertNil(try! keychain.get("password"), "removed password")
     }
     }
     
     
     func testRemoveData() {
     func testRemoveData() {
         let JSONObject = ["username": "kishikawakatsumi", "password": "password1234"]
         let JSONObject = ["username": "kishikawakatsumi", "password": "password1234"]
-        let JSONData = NSJSONSerialization.dataWithJSONObject(JSONObject, options: nil, error: nil)
+        let JSONData = try! NSJSONSerialization.dataWithJSONObject(JSONObject, options: [])
         
         
         let keychain = Keychain(service: "Twitter")
         let keychain = Keychain(service: "Twitter")
         
         
-        XCTAssertNil(keychain.getData("JSONData"), "not stored JSON data")
+        XCTAssertNil(try! keychain.getData("JSONData"), "not stored JSON data")
         
         
-        keychain.set(JSONData!, key: "JSONData")
-        XCTAssertEqual(keychain.getData("JSONData")!, JSONData!, "stored JSON data")
+        do { try keychain.set(JSONData, key: "JSONData") } catch {}
+        XCTAssertEqual(try! keychain.getData("JSONData")!, JSONData, "stored JSON data")
         
         
-        keychain.remove("JSONData")
-        XCTAssertNil(keychain.getData("JSONData"), "removed JSON data")
+        do { try keychain.remove("JSONData") } catch {}
+        XCTAssertNil(try! keychain.getData("JSONData"), "removed JSON data")
     }
     }
     
     
     // MARK:
     // MARK:
@@ -357,173 +353,128 @@ class KeychainAccessTests: XCTestCase {
         XCTAssertNil(keychain[string: "password"], "removed password")
         XCTAssertNil(keychain[string: "password"], "removed password")
 
 
         let JSONObject = ["username": "kishikawakatsumi", "password": "password1234"]
         let JSONObject = ["username": "kishikawakatsumi", "password": "password1234"]
-        let JSONData = NSJSONSerialization.dataWithJSONObject(JSONObject, options: nil, error: nil)
+        let JSONData = try! NSJSONSerialization.dataWithJSONObject(JSONObject, options: [])
 
 
         XCTAssertNil(keychain[data:"JSONData"], "not stored JSON data")
         XCTAssertNil(keychain[data:"JSONData"], "not stored JSON data")
 
 
         keychain[data: "JSONData"] = JSONData
         keychain[data: "JSONData"] = JSONData
-        XCTAssertEqual(keychain[data:"JSONData"]!, JSONData!, "stored JSON data")
+        XCTAssertEqual(keychain[data:"JSONData"]!, JSONData, "stored JSON data")
     }
     }
     
     
     // MARK:
     // MARK:
     
     
     #if os(iOS)
     #if os(iOS)
     func testErrorHandling() {
     func testErrorHandling() {
-        if let error = Keychain(service: "Twitter", accessGroup: "12ABCD3E4F.shared").removeAll() {
-            XCTAssertNil(error, "no error occurred")
+        do {
+            let keychain = Keychain(service: "Twitter", accessGroup: "12ABCD3E4F.shared")
+            try keychain.removeAll()
+            XCTAssertTrue(true, "no error occurred")
+        } catch {
+            XCTFail("error occurred")
         }
         }
-        if let error = Keychain(service: "Twitter").removeAll() {
-            XCTAssertNil(error, "no error occurred")
+
+        do {
+            let keychain = Keychain(service: "Twitter")
+            try keychain.removeAll()
+            XCTAssertTrue(true, "no error occurred")
+        } catch {
+            XCTFail("error occurred")
         }
         }
-        if let error = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS).removeAll() {
-            XCTAssertNil(error, "no error occurred")
+
+        do {
+            let keychain = Keychain(server: NSURL(string: "https://kishikawakatsumi.com")!, protocolType: .HTTPS)
+            try keychain.removeAll()
+            XCTAssertTrue(true, "no error occurred")
+        } catch {
+            XCTFail("error occurred")
         }
         }
-        if let error = Keychain().removeAll() {
-            XCTAssertNil(error, "no error occurred")
+
+        do {
+            let keychain = Keychain()
+            try keychain.removeAll()
+            XCTAssertTrue(true, "no error occurred")
+        } catch {
+            XCTFail("error occurred")
         }
         }
         
         
-        locally {
+        do {
             // Add Keychain items
             // Add Keychain items
             let keychain = Keychain(service: "Twitter")
             let keychain = Keychain(service: "Twitter")
-            
-            if let error = keychain.set("kishikawa_katsumi", key: "username") {
-                XCTAssertNil(error, "no error occurred")
-            }
-            if let error = keychain.set("password_1234", key: "password") {
-                XCTAssertNil(error, "no error occurred")
-            }
-            
-            let username = keychain.getStringOrError("username")
-    
-            switch username { // enum
-            case .Success:
-                XCTAssertEqual(username.value!, "kishikawa_katsumi")
-            case .Failure:
-                XCTFail("unknown error occurred")
-            }
-            
-            if let error = username.error { // error object
-                XCTFail("unknown error occurred")
-            } else {
-                XCTAssertEqual(username.value!, "kishikawa_katsumi")
-            }
-            
-            if username.succeeded { // check succeeded property
-                XCTAssertEqual(username.value!, "kishikawa_katsumi")
-            } else {
-                XCTFail("unknown error occurred")
-            }
-            
-            if username.failed { // failed property
-                XCTFail("unknown error occurred")
-            } else {
-                XCTAssertEqual(username.value!, "kishikawa_katsumi")
-            }
-    
-            let password = keychain.getStringOrError("password")
-            switch password { // enum
-            case .Success:
-                XCTAssertEqual(password.value!, "password_1234")
-            case .Failure:
-                XCTFail("unknown error occurred")
+
+            do {
+                try keychain.set("kishikawa_katsumi", key: "username")
+                XCTAssertTrue(true, "no error occurred")
+            } catch {
+                XCTFail("error occurred")
             }
             }
-            
-            if let error = password.error { // error object
-                XCTFail("unknown error occurred")
-            } else {
-                XCTAssertEqual(password.value!, "password_1234")
+            do {
+                try keychain.set("password_1234", key: "password")
+                XCTAssertTrue(true, "no error occurred")
+            } catch {
+                XCTFail("error occurred")
             }
             }
-            
-            if password.succeeded { // check succeeded property
-                XCTAssertEqual(password.value!, "password_1234")
-            } else {
-                XCTFail("unknown error occurred")
+
+            do {
+                let username = try keychain.get("username")
+                XCTAssertEqual(username, "kishikawa_katsumi")
+            } catch {
+                XCTFail("error occurred")
             }
             }
-            
-            if password.failed { // failed property
-                XCTFail("unknown error occurred")
-            } else {
-                XCTAssertEqual(password.value!, "password_1234")
+            do {
+                let password = try keychain.get("password")
+                XCTAssertEqual(password, "password_1234")
+            } catch {
+                XCTFail("error occurred")
             }
             }
         }
         }
         
         
-        locally {
+        do {
             // Update Keychain items
             // Update Keychain items
             let keychain = Keychain(service: "Twitter")
             let keychain = Keychain(service: "Twitter")
-            
-            if let error = keychain.set("katsumi_kishikawa", key: "username") {
-                XCTAssertNil(error, "no error occurred")
-            }
-            if let error = keychain.set("1234_password", key: "password") {
-                XCTAssertNil(error, "no error occurred")
-            }
-            
-            let username = keychain.getStringOrError("username")
-            switch username { // enum
-            case .Success:
-                XCTAssertEqual(username.value!, "katsumi_kishikawa")
-            case .Failure:
-                XCTFail("unknown error occurred")
-            }
-            
-            if let error = username.error { // error object
-                XCTFail("unknown error occurred")
-            } else {
-                XCTAssertEqual(username.value!, "katsumi_kishikawa")
-            }
-            
-            if username.succeeded { // check succeeded property
-                XCTAssertEqual(username.value!, "katsumi_kishikawa")
-            } else {
-                XCTFail("unknown error occurred")
-            }
-            
-            if username.failed { // failed property
-                XCTFail("unknown error occurred")
-            } else {
-                XCTAssertEqual(username.value!, "katsumi_kishikawa")
-            }
-            
-            let password = keychain.getStringOrError("password")
-            switch password { // enum
-            case .Success:
-                XCTAssertEqual(password.value!, "1234_password")
-            case .Failure:
-                XCTFail("unknown error occurred")
+
+            do {
+                try keychain.set("katsumi_kishikawa", key: "username")
+                XCTAssertTrue(true, "no error occurred")
+            } catch {
+                XCTFail("error occurred")
             }
             }
-            
-            if let error = password.error { // check error object
-                XCTFail("unknown error occurred")
-            } else {
-                XCTAssertEqual(password.value!, "1234_password")
+            do {
+                try keychain.set("1234_password", key: "password")
+                XCTAssertTrue(true, "no error occurred")
+            } catch {
+                XCTFail("error occurred")
             }
             }
-            
-            if password.succeeded { // check succeeded property
-                XCTAssertEqual(password.value!, "1234_password")
-            } else {
-                XCTFail("unknown error occurred")
+
+            do {
+                let username = try keychain.get("username")
+                XCTAssertEqual(username, "katsumi_kishikawa")
+            } catch {
+                XCTFail("error occurred")
             }
             }
-            
-            if password.failed { // check failed property
-                XCTFail("unknown error occurred")
-            } else {
-                XCTAssertEqual(password.value!, "1234_password")
+            do {
+                let password = try keychain.get("password")
+                XCTAssertEqual(password, "1234_password")
+            } catch {
+                XCTFail("error occurred")
             }
             }
         }
         }
         
         
-        locally {
+        do {
             // Remove Keychain items
             // Remove Keychain items
             let keychain = Keychain(service: "Twitter")
             let keychain = Keychain(service: "Twitter")
-            
-            if let error = keychain.remove("username") {
-                XCTAssertNil(error, "no error occurred")
+
+            do {
+                try keychain.remove("username")
+                XCTAssertNil(try! keychain.get("username"))
+            } catch {
+                XCTFail("error occurred")
             }
             }
-            if let error = keychain.remove("password") {
-                XCTAssertNil(error, "no error occurred")
+            do {
+                try keychain.remove("password")
+                XCTAssertNil(try! keychain.get("username"))
+            } catch {
+                XCTFail("error occurred")
             }
             }
-            
-            XCTAssertNil(keychain.get("username"))
-            XCTAssertNil(keychain.get("password"))
         }
         }
     }
     }
     #endif
     #endif
@@ -542,114 +493,114 @@ class KeychainAccessTests: XCTestCase {
         let service_2 = "com.kishikawakatsumi.KeychainAccess"
         let service_2 = "com.kishikawakatsumi.KeychainAccess"
         let service_3 = "example.com"
         let service_3 = "example.com"
         
         
-        Keychain().removeAll()
-        Keychain(service: service_1).removeAll()
-        Keychain(service: service_2).removeAll()
-        Keychain(service: service_3).removeAll()
-        
-        XCTAssertNil(Keychain().get("username"), "not stored username")
-        XCTAssertNil(Keychain().get("password"), "not stored password")
-        XCTAssertNil(Keychain(service: service_1).get("username"), "not stored username")
-        XCTAssertNil(Keychain(service: service_1).get("password"), "not stored password")
-        XCTAssertNil(Keychain(service: service_2).get("username"), "not stored username")
-        XCTAssertNil(Keychain(service: service_2).get("password"), "not stored password")
-        XCTAssertNil(Keychain(service: service_3).get("username"), "not stored username")
-        XCTAssertNil(Keychain(service: service_3).get("password"), "not stored password")
-        
-        Keychain().set(username_1, key: "username")
-        XCTAssertEqual(Keychain().get("username")!, username_1, "stored username")
-        XCTAssertEqual(Keychain(service: service_1).get("username")!, username_1, "stored username")
-        XCTAssertNil(Keychain(service: service_2).get("username"), "not stored username")
-        XCTAssertNil(Keychain(service: service_3).get("username"), "not stored username")
-        
-        Keychain(service: service_1).set(username_1, key: "username")
-        XCTAssertEqual(Keychain().get("username")!, username_1, "stored username")
-        XCTAssertEqual(Keychain(service: service_1).get("username")!, username_1, "stored username")
-        XCTAssertNil(Keychain(service: service_2).get("username"), "not stored username")
-        XCTAssertNil(Keychain(service: service_3).get("username"), "not stored username")
-        
-        Keychain(service: service_2).set(username_2, key: "username")
-        XCTAssertEqual(Keychain().get("username")!, username_1, "stored username")
-        XCTAssertEqual(Keychain(service: service_1).get("username")!, username_1, "stored username")
-        XCTAssertEqual(Keychain(service: service_2).get("username")!, username_2, "stored username")
-        XCTAssertNil(Keychain(service: service_3).get("username"), "not stored username")
-        
-        Keychain(service: service_3).set(username_3, key: "username")
-        XCTAssertEqual(Keychain().get("username")!, username_1, "stored username")
-        XCTAssertEqual(Keychain(service: service_1).get("username")!, username_1, "stored username")
-        XCTAssertEqual(Keychain(service: service_2).get("username")!, username_2, "stored username")
-        XCTAssertEqual(Keychain(service: service_3).get("username")!, username_3, "stored username")
-        
-        Keychain().set(password_1, key: "password")
-        XCTAssertEqual(Keychain().get("password")!, password_1, "stored password")
-        XCTAssertEqual(Keychain(service: service_1).get("password")!, password_1, "stored password")
-        XCTAssertNil(Keychain(service: service_2).get("password"), "not stored password")
-        XCTAssertNil(Keychain(service: service_3).get("password"), "not stored password")
-        
-        Keychain(service: service_1).set(password_1, key: "password")
-        XCTAssertEqual(Keychain().get("password")!, password_1, "stored password")
-        XCTAssertEqual(Keychain(service: service_1).get("password")!, password_1, "stored password")
-        XCTAssertNil(Keychain(service: service_2).get("password"), "not stored password")
-        XCTAssertNil(Keychain(service: service_3).get("password"), "not stored password")
-        
-        Keychain(service: service_2).set(password_2, key: "password")
-        XCTAssertEqual(Keychain().get("password")!, password_1, "stored password")
-        XCTAssertEqual(Keychain(service: service_1).get("password")!, password_1, "stored password")
-        XCTAssertEqual(Keychain(service: service_2).get("password")!, password_2, "stored password")
-        XCTAssertNil(Keychain(service: service_3).get("password"), "not stored password")
-        
-        Keychain(service: service_3).set(password_3, key: "password")
-        XCTAssertEqual(Keychain().get("password")!, password_1, "stored password")
-        XCTAssertEqual(Keychain(service: service_1).get("password")!, password_1, "stored password")
-        XCTAssertEqual(Keychain(service: service_2).get("password")!, password_2, "stored password")
-        XCTAssertEqual(Keychain(service: service_3).get("password")!, password_3, "stored password")
-        
-        Keychain().remove("username")
-        XCTAssertNil(Keychain().get("username"), "removed username")
-        XCTAssertNil(Keychain(service: service_1).get("username"), "removed username")
-        XCTAssertEqual(Keychain(service: service_2).get("username")!, username_2, "left username")
-        XCTAssertEqual(Keychain(service: service_3).get("username")!, username_3, "left username")
-        
-        Keychain(service: service_1).remove("username")
-        XCTAssertNil(Keychain().get("username"), "removed username")
-        XCTAssertNil(Keychain(service: service_1).get("username"), "removed username")
-        XCTAssertEqual(Keychain(service: service_2).get("username")!, username_2, "left username")
-        XCTAssertEqual(Keychain(service: service_3).get("username")!, username_3, "left username")
-        
-        Keychain(service: service_2).remove("username")
-        XCTAssertNil(Keychain().get("username"), "removed username")
-        XCTAssertNil(Keychain(service: service_1).get("username"), "removed username")
-        XCTAssertNil(Keychain(service: service_2).get("username"), "removed username")
-        XCTAssertEqual(Keychain(service: service_3).get("username")!, username_3, "left username")
-        
-        Keychain(service: service_3).remove("username")
-        XCTAssertNil(Keychain().get("username"), "removed username")
-        XCTAssertNil(Keychain(service: service_1).get("username"), "removed username")
-        XCTAssertNil(Keychain(service: service_2).get("username"), "removed username")
-        XCTAssertNil(Keychain(service: service_3).get("username"), "removed username")
-        
-        Keychain().remove("password")
-        XCTAssertNil(Keychain().get("password"), "removed password")
-        XCTAssertNil(Keychain(service: service_1).get("password"), "removed password")
-        XCTAssertEqual(Keychain(service: service_2).get("password")!, password_2, "left password")
-        XCTAssertEqual(Keychain(service: service_3).get("password")!, password_3, "left password")
-        
-        Keychain(service: service_1).remove("password")
-        XCTAssertNil(Keychain().get("password"), "removed password")
-        XCTAssertNil(Keychain(service: service_1).get("password"), "removed password")
-        XCTAssertEqual(Keychain(service: service_2).get("password")!, password_2, "left password")
-        XCTAssertEqual(Keychain(service: service_3).get("password")!, password_3, "left password")
-        
-        Keychain(service: service_2).remove("password")
-        XCTAssertNil(Keychain().get("password"), "removed password")
-        XCTAssertNil(Keychain(service: service_1).get("password"), "removed password")
-        XCTAssertNil(Keychain(service: service_2).get("password"), "removed password")
-        XCTAssertEqual(Keychain(service: service_3).get("password")!, password_3, "left password")
-        
-        Keychain(service: service_3).remove("password")
-        XCTAssertNil(Keychain().get("password"), "removed password")
-        XCTAssertNil(Keychain(service: service_2).get("password"), "removed password")
-        XCTAssertNil(Keychain(service: service_2).get("password"), "removed password")
-        XCTAssertNil(Keychain(service: service_2).get("password"), "removed password")
+        do { try Keychain().removeAll() } catch {}
+        do { try Keychain(service: service_1).removeAll() } catch {}
+        do { try Keychain(service: service_2).removeAll() } catch {}
+        do { try Keychain(service: service_3).removeAll() } catch {}
+        
+        XCTAssertNil(try! Keychain().get("username"), "not stored username")
+        XCTAssertNil(try! Keychain().get("password"), "not stored password")
+        XCTAssertNil(try! Keychain(service: service_1).get("username"), "not stored username")
+        XCTAssertNil(try! Keychain(service: service_1).get("password"), "not stored password")
+        XCTAssertNil(try! Keychain(service: service_2).get("username"), "not stored username")
+        XCTAssertNil(try! Keychain(service: service_2).get("password"), "not stored password")
+        XCTAssertNil(try! Keychain(service: service_3).get("username"), "not stored username")
+        XCTAssertNil(try! Keychain(service: service_3).get("password"), "not stored password")
+        
+        do { try Keychain().set(username_1, key: "username") } catch {}
+        XCTAssertEqual(try! Keychain().get("username")!, username_1, "stored username")
+        XCTAssertEqual(try! Keychain(service: service_1).get("username")!, username_1, "stored username")
+        XCTAssertNil(try! Keychain(service: service_2).get("username"), "not stored username")
+        XCTAssertNil(try! Keychain(service: service_3).get("username"), "not stored username")
+        
+        do { try Keychain(service: service_1).set(username_1, key: "username") } catch {}
+        XCTAssertEqual(try! Keychain().get("username")!, username_1, "stored username")
+        XCTAssertEqual(try! Keychain(service: service_1).get("username")!, username_1, "stored username")
+        XCTAssertNil(try! Keychain(service: service_2).get("username"), "not stored username")
+        XCTAssertNil(try! Keychain(service: service_3).get("username"), "not stored username")
+        
+        do { try Keychain(service: service_2).set(username_2, key: "username") } catch {}
+        XCTAssertEqual(try! Keychain().get("username")!, username_1, "stored username")
+        XCTAssertEqual(try! Keychain(service: service_1).get("username")!, username_1, "stored username")
+        XCTAssertEqual(try! Keychain(service: service_2).get("username")!, username_2, "stored username")
+        XCTAssertNil(try! Keychain(service: service_3).get("username"), "not stored username")
+        
+        do { try Keychain(service: service_3).set(username_3, key: "username") } catch {}
+        XCTAssertEqual(try! Keychain().get("username")!, username_1, "stored username")
+        XCTAssertEqual(try! Keychain(service: service_1).get("username")!, username_1, "stored username")
+        XCTAssertEqual(try! Keychain(service: service_2).get("username")!, username_2, "stored username")
+        XCTAssertEqual(try! Keychain(service: service_3).get("username")!, username_3, "stored username")
+
+        do { try Keychain().set(password_1, key: "password") } catch {}
+        XCTAssertEqual(try! Keychain().get("password")!, password_1, "stored password")
+        XCTAssertEqual(try! Keychain(service: service_1).get("password")!, password_1, "stored password")
+        XCTAssertNil(try! Keychain(service: service_2).get("password"), "not stored password")
+        XCTAssertNil(try! Keychain(service: service_3).get("password"), "not stored password")
+        
+        do { try Keychain(service: service_1).set(password_1, key: "password") } catch {}
+        XCTAssertEqual(try! Keychain().get("password")!, password_1, "stored password")
+        XCTAssertEqual(try! Keychain(service: service_1).get("password")!, password_1, "stored password")
+        XCTAssertNil(try! Keychain(service: service_2).get("password"), "not stored password")
+        XCTAssertNil(try! Keychain(service: service_3).get("password"), "not stored password")
+        
+        do { try Keychain(service: service_2).set(password_2, key: "password") } catch {}
+        XCTAssertEqual(try! Keychain().get("password")!, password_1, "stored password")
+        XCTAssertEqual(try! Keychain(service: service_1).get("password")!, password_1, "stored password")
+        XCTAssertEqual(try! Keychain(service: service_2).get("password")!, password_2, "stored password")
+        XCTAssertNil(try! Keychain(service: service_3).get("password"), "not stored password")
+        
+        do { try Keychain(service: service_3).set(password_3, key: "password") } catch {}
+        XCTAssertEqual(try! Keychain().get("password")!, password_1, "stored password")
+        XCTAssertEqual(try! Keychain(service: service_1).get("password")!, password_1, "stored password")
+        XCTAssertEqual(try! Keychain(service: service_2).get("password")!, password_2, "stored password")
+        XCTAssertEqual(try! Keychain(service: service_3).get("password")!, password_3, "stored password")
+        
+        do { try Keychain().remove("username") } catch {}
+        XCTAssertNil(try! Keychain().get("username"), "removed username")
+        XCTAssertNil(try! Keychain(service: service_1).get("username"), "removed username")
+        XCTAssertEqual(try! Keychain(service: service_2).get("username")!, username_2, "left username")
+        XCTAssertEqual(try! Keychain(service: service_3).get("username")!, username_3, "left username")
+        
+        do { try Keychain(service: service_1).remove("username") } catch {}
+        XCTAssertNil(try! Keychain().get("username"), "removed username")
+        XCTAssertNil(try! Keychain(service: service_1).get("username"), "removed username")
+        XCTAssertEqual(try! Keychain(service: service_2).get("username")!, username_2, "left username")
+        XCTAssertEqual(try! Keychain(service: service_3).get("username")!, username_3, "left username")
+        
+        do { try Keychain(service: service_2).remove("username") } catch {}
+        XCTAssertNil(try! Keychain().get("username"), "removed username")
+        XCTAssertNil(try! Keychain(service: service_1).get("username"), "removed username")
+        XCTAssertNil(try! Keychain(service: service_2).get("username"), "removed username")
+        XCTAssertEqual(try! Keychain(service: service_3).get("username")!, username_3, "left username")
+        
+        do { try Keychain(service: service_3).remove("username") } catch {}
+        XCTAssertNil(try! Keychain().get("username"), "removed username")
+        XCTAssertNil(try! Keychain(service: service_1).get("username"), "removed username")
+        XCTAssertNil(try! Keychain(service: service_2).get("username"), "removed username")
+        XCTAssertNil(try! Keychain(service: service_3).get("username"), "removed username")
+        
+        do { try Keychain().remove("password") } catch {}
+        XCTAssertNil(try! Keychain().get("password"), "removed password")
+        XCTAssertNil(try! Keychain(service: service_1).get("password"), "removed password")
+        XCTAssertEqual(try! Keychain(service: service_2).get("password")!, password_2, "left password")
+        XCTAssertEqual(try! Keychain(service: service_3).get("password")!, password_3, "left password")
+        
+        do { try Keychain(service: service_1).remove("password") } catch {}
+        XCTAssertNil(try! Keychain().get("password"), "removed password")
+        XCTAssertNil(try! Keychain(service: service_1).get("password"), "removed password")
+        XCTAssertEqual(try! Keychain(service: service_2).get("password")!, password_2, "left password")
+        XCTAssertEqual(try! Keychain(service: service_3).get("password")!, password_3, "left password")
+        
+        do { try Keychain(service: service_2).remove("password") } catch {}
+        XCTAssertNil(try! Keychain().get("password"), "removed password")
+        XCTAssertNil(try! Keychain(service: service_1).get("password"), "removed password")
+        XCTAssertNil(try! Keychain(service: service_2).get("password"), "removed password")
+        XCTAssertEqual(try! Keychain(service: service_3).get("password")!, password_3, "left password")
+        
+        do { try Keychain(service: service_3).remove("password") } catch {}
+        XCTAssertNil(try! Keychain().get("password"), "removed password")
+        XCTAssertNil(try! Keychain(service: service_2).get("password"), "removed password")
+        XCTAssertNil(try! Keychain(service: service_2).get("password"), "removed password")
+        XCTAssertNil(try! Keychain(service: service_2).get("password"), "removed password")
     }
     }
 }
 }

+ 3 - 1
Lib/Rakefile

@@ -7,7 +7,9 @@ def destinations
     'name=iPhone 5,OS=8.1',
     'name=iPhone 5,OS=8.1',
     'name=iPhone 5s,OS=8.1',
     'name=iPhone 5s,OS=8.1',
     'name=iPhone 6,OS=8.1',
     'name=iPhone 6,OS=8.1',
-    'name=iPhone 6 Plus,OS=8.1'
+    'name=iPhone 6 Plus,OS=8.1',
+    'name=iPhone 6,OS=9.0',
+    'name=iPhone 6 Plus,OS=9.0'
   ]
   ]
 end
 end
 
 

+ 63 - 102
README.md

@@ -103,8 +103,8 @@ keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
 #### error handling
 #### error handling
 
 
 ```swift
 ```swift
-if let error = keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi") {
-    println("error: \(error)")
+if let error = try? keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi") {
+    print("error: \(error)")
 }
 }
 ```
 ```
 
 
@@ -133,66 +133,17 @@ let secretData = keychain[data: "secret"]
 ##### as String
 ##### as String
 
 
 ```swift
 ```swift
-let token = keychain.get("kishikawakatsumi")
+let token = try? keychain.get("kishikawakatsumi")
 ```
 ```
 
 
 ```swift
 ```swift
-let token = keychain.getString("kishikawakatsumi")
+let token = try? keychain.getString("kishikawakatsumi")
 ```
 ```
 
 
 ##### as NSData
 ##### as NSData
 
 
 ```swift
 ```swift
-let data = keychain.getData("kishikawakatsumi")
-```
-
-#### error handling
-
-**First, get the `failable` (value or error) object**
-
-```swift
-let failable = keychain.getStringOrError("kishikawakatsumi")
-```
-
-**1. check `enum` state**
-
-```swift
-switch failable {
-case .Success:
-  println("token: \(failable.value)")
-case .Failure:
-  println("error: \(failable.error)")
-}
-```
-
-**2. check `error` object**
-
-```swift
-if let error = failable.error {
-    println("error: \(error)")
-} else {
-    println("token: \(failable.value)")
-}
-```
-
-**3. check `succeeded` property**
-
-```swift
-if failable.succeeded {
-    println("token: \(failable.value)")
-} else {
-    println("error: \(failable.error)")
-}
-```
-
-**4. check `failed` property**
-
-```swift
-if failable.failed {
-    println("error: \(failable.error)")
-} else {
-    println("token: \(failable.value)")
-}
+let data = try? keychain.getData("kishikawakatsumi")
 ```
 ```
 
 
 ### :key: Removing an item
 ### :key: Removing an item
@@ -206,14 +157,10 @@ keychain["kishikawakatsumi"] = nil
 #### remove method
 #### remove method
 
 
 ```swift
 ```swift
-keychain.remove("kishikawakatsumi")
-```
-
-#### error handling
-
-```swift
-if let error = keychain.remove("kishikawakatsumi") {
-    println("error: \(error)")
+do {
+    try keychain.remove("kishikawakatsumi")
+} catch let error {
+    print("error: \(error)")
 }
 }
 ```
 ```
 
 
@@ -221,10 +168,14 @@ if let error = keychain.remove("kishikawakatsumi") {
 
 
 ```swift
 ```swift
 let keychain = Keychain(server: "https://github.com", protocolType: .HTTPS)
 let keychain = Keychain(server: "https://github.com", protocolType: .HTTPS)
-keychain
-    .label("github.com (kishikawakatsumi)")
-    .comment("github access token")
-    .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
+do {
+    try keychain
+        .label("github.com (kishikawakatsumi)")
+        .comment("github access token")
+        .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
+} catch let error {
+    print("error: \(error)")
+}
 ```
 ```
 
 
 ### :key: Configuration (Accessibility, Sharing, iCould Sync)
 ### :key: Configuration (Accessibility, Sharing, iCould Sync)
@@ -262,9 +213,13 @@ keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
 ```swift
 ```swift
 let keychain = Keychain(service: "com.example.github-token")
 let keychain = Keychain(service: "com.example.github-token")
 
 
-keychain
-    .accessibility(.AfterFirstUnlock)
-    .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
+do {
+    try keychain
+        .accessibility(.AfterFirstUnlock)
+        .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
+} catch let error {
+    print("error: \(error)")
+}
 ```
 ```
 
 
 ##### For foreground application
 ##### For foreground application
@@ -283,9 +238,13 @@ keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
 ```swift
 ```swift
 let keychain = Keychain(service: "com.example.github-token")
 let keychain = Keychain(service: "com.example.github-token")
 
 
-keychain
-    .accessibility(.WhenUnlocked)
-    .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
+do {
+    try keychain
+        .accessibility(.WhenUnlocked)
+        .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
+} catch let error {
+    print("error: \(error)")
+}
 ```
 ```
 
 
 #### :couple: Sharing Keychain items
 #### :couple: Sharing Keychain items
@@ -310,9 +269,13 @@ keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
 ```swift
 ```swift
 let keychain = Keychain(service: "com.example.github-token")
 let keychain = Keychain(service: "com.example.github-token")
 
 
-keychain
-    .synchronizable(true)
-    .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
+do {
+    try keychain
+        .synchronizable(true)
+        .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
+} catch let error {
+    print("error: \(error)")
+}
 ```
 ```
 
 
 ### <a name="touch_id_integration"> :fu: Touch ID integration
 ### <a name="touch_id_integration"> :fu: Touch ID integration
@@ -328,11 +291,11 @@ If you want to store the Touch ID protected Keychain item, specify `accessibilit
 let keychain = Keychain(service: "com.example.github-token")
 let keychain = Keychain(service: "com.example.github-token")
 
 
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
-    let error = keychain
-        .accessibility(.WhenPasscodeSetThisDeviceOnly, authenticationPolicy: .UserPresence)
-        .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
-
-    if error != nil {
+    do {
+        try keychain
+            .accessibility(.WhenPasscodeSetThisDeviceOnly, authenticationPolicy: .UserPresence)
+            .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
+    } catch let error {
         // Error handling if needed...
         // Error handling if needed...
     }
     }
 }
 }
@@ -352,12 +315,12 @@ If the item not protected, the `authenticationPrompt` parameter just be ignored.
 let keychain = Keychain(service: "com.example.github-token")
 let keychain = Keychain(service: "com.example.github-token")
 
 
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
-    let error = keychain
-        .accessibility(.WhenPasscodeSetThisDeviceOnly, authenticationPolicy: .UserPresence)
-        .authenticationPrompt("Authenticate to update your access token")
-        .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
-
-    if error != nil {
+    do {
+        try keychain
+            .accessibility(.WhenPasscodeSetThisDeviceOnly, authenticationPolicy: .UserPresence)
+            .authenticationPrompt("Authenticate to update your access token")
+            .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
+    } catch let error {
         // Error handling if needed...
         // Error handling if needed...
     }
     }
 }
 }
@@ -373,14 +336,13 @@ If the item not protected, the `authenticationPrompt` parameter just be ignored.
 let keychain = Keychain(service: "com.example.github-token")
 let keychain = Keychain(service: "com.example.github-token")
 
 
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
-    let failable = keychain
-        .authenticationPrompt("Authenticate to login to server")
-        .getStringOrError("kishikawakatsumi")
-
-    if failable.succeeded {
-        println("value: \(failable.value)")
-    } else {
-        println("error: \(failable.error?.localizedDescription)")
+    do {
+        let password = try keychain
+            .authenticationPrompt("Authenticate to login to server")
+            .get("kishikawakatsumi")
+
+        print("password: \(password)")
+    } catch let error {
         // Error handling if needed...
         // Error handling if needed...
     }
     }
 }
 }
@@ -394,10 +356,9 @@ There is no way to show Touch ID or passcode authentication when removing Keycha
 ```swift
 ```swift
 let keychain = Keychain(service: "com.example.github-token")
 let keychain = Keychain(service: "com.example.github-token")
 
 
-let error = keychain.remove("kishikawakatsumi")
-
-if error != nil {
-    println("error: \(error?.localizedDescription)")
+do {
+    try keychain.remove("kishikawakatsumi")
+} catch let error {
     // Error handling if needed...
     // Error handling if needed...
 }
 }
 ```
 ```
@@ -414,7 +375,7 @@ let keychain = Keychain(server: "https://www.kishikawakatsumi.com", protocolType
 let username = "kishikawakatsumi@mac.com"
 let username = "kishikawakatsumi@mac.com"
 
 
 // First, check the credential in the app's Keychain
 // First, check the credential in the app's Keychain
-if let password = keychain.get(username) {
+if let password = try? keychain.get(username) {
     // If found password in the Keychain,
     // If found password in the Keychain,
     // then log into the server
     // then log into the server
 } else {
 } else {
@@ -476,7 +437,7 @@ let password = Keychain.generatePassword() // => Nhu-GKm-s3n-pMx
 
 
 ```swift
 ```swift
 let keychain = Keychain(server: "https://github.com", protocolType: .HTTPS)
 let keychain = Keychain(server: "https://github.com", protocolType: .HTTPS)
-println("\(keychain)")
+print("\(keychain)")
 ```
 ```
 
 
 ```
 ```
@@ -495,7 +456,7 @@ let keychain = Keychain(server: "https://github.com", protocolType: .HTTPS)
 
 
 let keys = keychain.allKeys()
 let keys = keychain.allKeys()
 for key in keys {
 for key in keys {
-  println("key: \(key)")
+  print("key: \(key)")
 }
 }
 ```
 ```
 
 
@@ -513,7 +474,7 @@ let keychain = Keychain(server: "https://github.com", protocolType: .HTTPS)
 
 
 let items = keychain.allItems()
 let items = keychain.allItems()
 for item in items {
 for item in items {
-  println("item: \(item)")
+  print("item: \(item)")
 }
 }
 ```
 ```
 
 

部分文件因文件數量過多而無法顯示