iOS開發-開發總結(六)

swift中指針的使用javascript

在 Swift 中,指針都使用一個特殊的類型來表示,那就是 UnsafePointer<T>。遵循了 Cocoa 的一向不可變原則,UnsafePointer<T> 也是不可變的。固然對應地,它還有一個可變變體,UnsafeMutablePointer<T>。絕大部分時間裏,C 中的指針都會被以這兩種類型引入到 Swift 中:C 中 const 修飾的指針對應 UnsafePointer (最多見的應該就是 C 字符串的 const char * 了),而其餘可變的指針則對應 UnsafeMutablePointer。除此以外,Swift 中存在表示一組連續數據指針的 UnsafeBufferPointer<T>,表示非完整結構的不透明指針 COpaquePointer 等等。另外你可能已經注意到了,可以肯定指向內容的指針類型都是泛型的 struct,咱們能夠經過這個泛型來對指針指向的類型進行約束以提供必定安全性。

對 於一個 UnsafePointer<T> 類型,咱們能夠經過 memory 屬性對其進行取值,若是這個指針是可變的 UnsafeMutablePointer<T> 類型,咱們還能夠經過 memory 對它進行賦值。好比咱們想要寫一個利用指針直接操做內存的計數器的話,能夠這麼作:
func incrementor(ptr: UnsafeMutablePointer<Int>) {
    ptr.memory += 1
}

var a = 10
incrementor(&a)

a  // 11

OC-JS簡單封裝
複製代碼
[webView stringByEvaluatingJavaScriptFromString:@"var script = document.createElement('script');"  
         "script.type = 'text/javascript';"  
         "script.text = \"function myFunction() { "  
         "var field = document.getElementsByName('q')[0];"  
         "field.value='iCocos';"  
         "document.forms[0].submit();"  
         "}\";"  
         "document.getElementsByTagName('head')[0].appendChild(script);"];   
        
        [webView stringByEvaluatingJavaScriptFromString:@"myFunction();"];
複製代碼
 

IBInspectable在IB的Attribute Inspector(屬性檢查器)中查看類的屬性,而IBDesignable能實時更新視圖,很厲害吧!
@IBDesignable class CustomView : UIView {
    @IBInspectable var borderColor: UIColor = UIColor.clearColor()  
    @IBInspectable var borderWidth: CGFloat = 0  
    @IBInspectable var cornerRadius: CGFloat = 0  
}


 
快速查找控制器
複製代碼
 1 extension UIView {
 2 
 3 
 4     func findController() -> UIViewController! {
 5         return self.findControllerWithClass(UIViewController.self)
 6     }
 7 
 8     func findNavigator() -> UINavigationController! {
 9         return self.findControllerWithClass(UINavigationController.self)
10     }
11 
12     func findControllerWithClass<T>(clzz: AnyClass) -> T? {
13         var responder = self.nextResponder()
14         while(responder != nil) {
15             if (responder!.isKindOfClass(clzz)) {
16                 return responder as? T
17             }
18             responder = responder?.nextResponder()
19         }
20 
21         return nil
22     }
23 
24 }
25  
26  
27 if UI_USER_INTERFACE_IDIOM() == .Pad {  
28     // 設備是 iPad
29 }
30 
31 if UIInterfaceOrientationIsPortrait(orientation) {  
32     // 屏幕是豎屏
33 }
複製代碼

 

Xcode默認使用https的解決方案java

<key>NSAppTransportSecurity</key><dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/></dict>

 

IBInspectable在IB的Attribute Inspector(屬性檢查器)中查看類的屬性,而IBDesignable能實時更新視圖

IBDesignable 
主要做用:能夠顯示出來你使用代碼寫的界面。
使用方法:在swift裏,@IBDesignable關鍵字寫在class前便可。 
在OC裏,是IB_DESIGNABLE這個關鍵字,寫在@implementation前便可 
IBInspectable 
主要做用:使view內的變量可視化,而且能夠修改後立刻看到 

使用方法:在swift裏,@IBInspectable關鍵字寫在須要顯示的變量前便可 
在OC裏,是IBInspectable這個關鍵字,寫在須要顯示的變量前便可 
另外附兩個快捷鍵: 
command+shift+O,快速打開須要的文件 
control+shift+鼠標左擊sb,能夠選擇須要的sb活着view

   
複製代碼
 1 // 1.獲取images文件夾中全部的文件
 2     NSString *sourcePath = @"/Users/apple/Desktop/abc";
 3     NSString *dest = @"/Users/apple/Desktop/lnj";
 4     
 5     // 2.獲取images文件夾中全部的文件
 6     NSFileManager *mgr = [NSFileManager defaultManager];
 7     NSArray *subPaths = [mgr subpathsAtPath:sourcePath];
 8     //    NSLog(@"%@", subPaths);
 9     // 3.剪切文件到lnj文件夾中
10  
11      for (int i = 0; i < subPaths.count; i++) {
12      // 3.1獲取當前遍歷到得文件的名稱
13      NSString *fileNmae = subPaths[i];
14      // 3.2根據當前文件的名稱, 拼接全路徑
15      NSString *fromPath = [sourcePath stringByAppendingPathComponent:fileNmae];
16      NSString *toPath = [dest stringByAppendingPathComponent:fileNmae];
17      NSLog(@"fromPath = %@", fromPath);
18      NSLog(@"toPath = %@", toPath);
19      
20      [mgr moveItemAtPath:fromPath toPath:toPath error:nil];
21      }
22     
23     dispatch_apply(subPaths.count, dispatch_get_global_queue(0, 0), ^(size_t index) {
24         // 3.1獲取當前遍歷到得文件的名稱
25         NSString *fileNmae = subPaths[index];
26         // 3.2根據當前文件的名稱, 拼接全路徑
27         NSString *fromPath = [sourcePath stringByAppendingPathComponent:fileNmae];
28         NSString *toPath = [dest stringByAppendingPathComponent:fileNmae];
29         NSLog(@"fromPath = %@", fromPath);
30         NSLog(@"toPath = %@", toPath);
31         
32         [mgr moveItemAtPath:fromPath toPath:toPath error:nil];
33         
34     });
35  
複製代碼

 

 
檢查方法的可用性

用respondsToSelector檢查框架內是否含有此方法。例如:iOS 9在Core Location框架中新增了allowsBackgroundLocationUpdates屬性:

CLLocationManager *manager = [CLLocationManager new];
if ([manager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
  // 在iOS 8中不可用
  manager.allowsBackgroundLocationUpdates = YES;
}
陷阱

這 些方法既難以維護,又沒有看上去那麼安全。也許某個API如今是公有的,但在早期的版本中卻有多是私有的。例如:iOS 9中新增了幾個文本樣式,如UIFontTextStyleCallout。若是隻想在iOS 9中使用這種樣式,你能夠檢查其是否存在,由於它在iOS 8中應該是null的:
if (UIFontTextStyleCallout) {
  textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCallout];
}

 

不幸的是結果並不是如此。原來這個標誌在iOS 8中是存在的,只是沒有宣佈公有。使用一個私有的方法或值有可能出現難以預料的結果,何況這也和咱們的想法不一樣。

Swift 2的方法

Swift 2內置了可用性檢查,並且是在編譯時進行檢查。這意味着當咱們使用當前部署版本不可用的API時,Xcode可以通知咱們。例如:若是我在部署版本爲iOS 8的狀況下使用CNContactStore,Xcode將提出如下改進:
if #available(iOS 9.0, *) {
  let store = CNContactStore()
} else {
  // 舊版本的狀況
}

一樣這能夠取代咱們以前使用的respondsToSelector:
let manager = CLLocationManager()
if #available(iOS 9.0, *) {
  manager.allowsBackgroundLocationUpdates = true
}

可用性檢查的使用情形web


#available條件適用於一系列平臺(iOS, OSX, watchOS) 和版本號。例如:對於只在iOS 9或OS X 10.10上運行的代碼:
 
if #available(iOS 9, OSX 10.10, *) {
  // 將在iOS 9或OS X 10.10上執行的代碼
}
即便你的App並無部署在其餘平臺,最後也須要用*通配符來包括它們。

若是某塊代碼只在特定的平臺版本下執行,你能夠用guard聲明配合#available來提早return,這樣能夠加強可讀性:
複製代碼
private func somethingNew() {
  guard #available(iOS 9, *) else { return }
  // 在iOS 9中執行的代碼
  let store = CNContactStore()
  let predicate = CNContact.predicateForContactsMatchingName("Zakroff")
  let keys = [CNContactGivenNameKey, CNContactFamilyNameKey]
  ...
}
複製代碼

若是整個方法或類只在特定的平臺版本下存在,用@available:
@available(iOS 9.0, *)
private func checkContact() {
  let store = CNContactStore()
  // ...
}

編譯時的安全性檢查swift


結束前,讓咱們再看看那個常量在iOS 9中公有卻在iOS 8中私有的問題。若是部署版本爲iOS 8,咱們卻把字體設置爲一個只有iOS 9才能用的樣式,這將產生一個編譯錯誤:
 
label.font = UIFont.preferredFontForTextStyle(UIFontTextStyleCallout)
  • > 'UIFontTextStyleCallout' is only available on iOS 9.0 or newer
Swift使其便於調試,同時可以根據平臺版本賦一個合理的值:
if #available(iOS 9.0, *) {
  label.font = UIFont.preferredFontForTextStyle(UIFontTextStyleCallout)
} else {
  label.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)
}
相關文章
相關標籤/搜索