1. 程式人生 > >Swift編碼總結1

Swift編碼總結1

atm 本質 smi reg mode bsp ani any 一個

1. fileprivate (set) var hasSetDiscount = false中fileprivate (set)表示什麽意思:

 //設置setter私有,但是getter為public

2.取值需要判斷:

 if let text = textField.text, !text.isEmpty {}
if let finish = resultDic["finish"] as? Bool,finish {
                  // finish為true
                }else{
                    // finish為false
}

3.flatMap使用:

dataSource = dataSource.flatMap({ (model) -> TipModel? in
            model.isChoosen = false
            return model
        })

4.dismiss之後push回到某個頁面:

self.dismiss(animated: false, completion: {
                let dvc = DishAAController()
                dvc.personNum 
= num if let tempNav = (UIApplication.shared.delegate as? AppDelegate)?.window?.rootViewController as? BaseNavigationController{ for vc in tempNav.childViewControllers { if vc.isKind(of: WaiterHomeViewController.self){ vc.navigationController
?.pushViewController(dvc, animated: false) } } } })

5.根據類型選擇不同的值:

使用枚舉和結構體。
import UIKit

struct ApplyPayModel {
    
    let type: ApplyPayType
    let qrString: String
    var title: String{
        return type.typeName()
    }
    var desc: String {
        return type.infoString
    } 
}

enum ApplyPayType: String {
    case ali = "ali"
    case wechat = "wechat"
    case card = "card"
    
    func typeName() -> String {
        switch self {
        case .ali:
            return GLOBAL_LANGUAGE("支付寶")
        case .wechat:
            return GLOBAL_LANGUAGE("微信支付")
        case .card:
            return GLOBAL_LANGUAGE("歡樂E卡")
        }
    }
    
    func getPayCompanyImageName()-> String {
        switch self {
        case .ali:
            return "AliPay"
        case .wechat:
            return "WeChat"
        case .card:
            return "ChinaMerchantsBank"
        }
    }
    
    var infoString: String {
        switch self {
        case .ali:
            return GLOBAL_LANGUAGE("支付寶掃碼 開通自動買單功能")
        case .wechat:
            return GLOBAL_LANGUAGE("微信掃碼 開通自動買單功能")
        case .card:
            return GLOBAL_LANGUAGE("歡樂E卡 開通自動買單功能")
        }
    }
    
}

6.點擊彈出控制器:

class LanguageViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.registerClassFromClass(type: UITableViewCell.self)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if let presentingViewController = self.presentationController {
            
            let size = tableView.sizeThatFits(presentingViewController.containerView?.size ?? .zero)
            self.preferredContentSize = CGSize(width: 200, height: size.height)
        }
    }
}

7.控制器傳model初始化控制器:

let model: CardPayHistoryInfoModel
    init(payinfo: CardPayHistoryInfoModel) {
        self.model = payinfo
        super.init(nibName: "NFCCardPrintPreviewController", bundle: nil)
        
    }

8.Struct定義model和Class定義model區別:

Swift中的類與結構體有如下相似點:

1.定義屬性來存儲值。

2.定義函數來提供功能。

3.通過定義下標語法使用下標的方式取值。

4.定義構造方法來對其進行初始化。

5.通過擴展來在原始基礎上添加功能。

6.通過協議來定義實現標準。

當然類和結構體也有許多不同點,下面這些功能是類獨有的,結構體沒有:

1.通過繼承來創建類的子類。

2.在運行時允許對類的實例進行類型的檢查和解釋。

3.析構方法可以釋放被類引用的資源。

4.通過引用計數允許一個類實例的多處引用。

當開發者在代碼中傳遞這些實例時,結構體總是被賦值,而類則是被引用。這是結構體和類的最本質區別。

9.對Action統一結構體處理:

 fileprivate struct Action {
        static let backClick = #selector(ScreenSaverController.back(_:))
    }

10.where Self: UIView 中的where Self是什麽意思?

@objc protocol NavigationBarProtocol: NSObjectProtocol {
    func updateViewForLanguage()
}

extension NavigationBarProtocol where Self: UIView{
    
    func configBackgroundColor() {
        self.backgroundColor = UIColor(hexString: "1f2124")
    }
    func addWaiterLoginSwipe(){
        self.viewController?.addWaiterLoginSwipe()
    }
}

NavigationBarProtocol這個協議只能被 UIView 繼承。

Swift編碼總結1