swift笔记

1 如何将数据转换成自己枚举值

rawValue 用于swift中的enum(枚举),用于取枚举项的原始值

//枚举  注意WirelessType:Int Int 要写上
  enum WirelessType:Int {
        case addition
        case substraction
        case multiplication
        case division
    }


  let sourceArr = ["1","3","2"];
        //获取值转换成string
        let numberString = sourceArr[1] as! String;
        //将string转化成int (?? 5)将默认值设为5
        let number = Int(numberString) ?? 5;
        //rawValue: 根据mmm获取对应枚举值
        let number_Emum =  WirelessType(rawValue: number);
        if number_Emum == WirelessType.multiplication {
            print("就是就是将数据");
        }

2 判断本地值(UserDefaults)是否存在

let loginMessage:Optional<NSDictionary> = UserDefaults.standard.value(forKey: "loginMessage") as? NSDictionary;
            
        if !(loginMessage == nil) {
            username = loginMessage?["loginName"] as! String;
            password = loginMessage?["password"] as! String;
        }

3创建tableview(不注册方法)

   var cell = tableView.dequeueReusableCell(withIdentifier: "ProjectHomeCell") as? ProjectHomeCell;
        if cell == nil {
            cell = ProjectHomeCell(style: .default, reuseIdentifier: "ProjectHomeCell");
        }
        cell?.leftLabel.text = "name";
        return cell!;
/**第二种*/
	 let cell:ProjectHomeCell = (tableView.dequeueReusableCell(withIdentifier: "identifier") ?? 	ProjectHomeCell(style: .default, reuseIdentifier: "identifier")) as! ProjectHomeCell;
        return cell;

4 swift 使用masonary

  let addView = UIView.init();
        self.view.addSubview(addView);
        addView.mas_makeConstraints { (make: MASConstraintMaker? ) in
            make?.width.equalTo()(100);
        };

5 swift中使用oc的block

OC回调

@property (nonatomic,copy) void(^changeSelectBlock)(NSString *nowSelectCode);
@property (nonatomic,copy) void(^changeSelectBlock_New)(NSString *nowSelectCode,NSString *nowSelectCodeTwo);

swift使用

 collectionScreenView.changeSelectBlock = { nowSelectCode in
            
        };
collectionScreenView.changeSelectBlock_New = {nowSelectCode , nowSelectCodeTwo in
            
        };

6 根据类名获取对应类

如果app的名称是中文,会出现获取不到问题;可以通过修改
build-setting—>packaging–>product name的名称为英文,同时修改info.plist中Bundle display name的名称为需要的中文名,这样CFBundleExecutable对应的就是修改后的英文

在这里插入图片描述

/// 根据Controller类名获取对应类
/// - Parameter clasName: 类名字符串
/// - Returns: 返回对应的类
func GetClassByName(clasName:String) -> UIViewController.Type {
    //1、获swift中的命名空间名
    var workName = Bundle.main.infoDictionary?["CFBundleExecutable"] as! String
    //2、如果包名中有'-'横线这样的字符,在拿到包名后,还需要把包名的'-'转换成'_'下横线
    workName = workName.replacingOccurrences(of: "-", with: "_")
    //3、拼接命名空间和类名,”包名.类名“
    let classNameNew: String = workName + "." + clasName;
    //通过NSClassFromString获取到最终的类,由于NSClassFromString返回的是AnyClass,这里要转换成UIViewController.Type类型
    var class_VC = NSClassFromString(classNameNew) as? UIViewController.Type;
    if class_VC == nil {
        //判断是否是OC的类
        class_VC = NSClassFromString(clasName) as? UIViewController.Type
    }
    //let vc = class_VC?.init()
    return class_VC!
}

7 将闭包作为参数时,使用时如何自动出现返回值对应名字

func Request_GET(urlStr:String,loading:Bool, parameters:[String:Any] ,successBlock: @escaping (_ resultInfo:[String:Any],_ resultCode:Int) -> Void) {

}

_ resultInfo:[String:Any],_ resultCode:Int
使用时,直接回车就可以自动出现resultInfo 、resultCode

  Request_GET(urlStr: "", loading: true, parameters: ["":""]) { resultInfo, resultCode in
            
        }

9 懒加载

** 使用懒加载闭包**
//使用懒加载闭包
lazy var testLabel:UILabel = {
let testLabel = UILabel(frame: .zero)
testLabel.text=“测试”
return testLabel
}()

使用工厂进行懒加载
lazy var testLabel:UILabel = self.creatLabel()
//静态方法
func creatLabel()->UILabel{
let label = UILabel(frame: .zero)
label.translatesAutoresizingMaskIntoConstraints = false
label.textColor = .black
return label
}

10.数组、字典、集合的操作

/**
         合并字典
         结果:
         oneDic、twoDic都不变
         threeDic = ["4": "4", "1": "3", "3": "3", "2": "2"]
         
         old 第一个字典中的内容
         new 第二个字典的内容
         return two 相同时保留two
         */
        var oneDic = ["1":"1","2":"2","3":"3"];
        let twoDic = ["1":"3","2":"2","3":"3","4":"4"];
        let threeDic = oneDic.merging(twoDic, uniquingKeysWith: { one, two in
            return two
        })
		
		/**直接将twoDic合并到oneDic中,oneDic直接被改变*/
 		oneDic.merge(twoDic,uniquingKeysWith:{ one, two in
            return new
        })
        
        /**
         合并数组
         arrayTwo内容依次添加到 arrayOne最后面
         结果:arrayTwo不变
         arrayOne = ["1", "2", "3", "1", "4", "3"]
         */
        var arrayOne = ["1","2","3"];
        let arrayTwo = ["1","4","3"];
        arrayOne.insert(contentsOf: arrayTwo, at: arrayOne.count);
		  
		/**
        截取数组中部分数据
        结果subArray为[1, 0, 100]
        */
        var arrayOne = [5, 2, 10, 1, 0, 100, 46, 99]
        let slice = arrayOne[3...5]//获取从第3位到第5位的值
        //不能直接将数组切片赋值给数组,需要使用Array(slice)才可以
        let subArray = Array(slice)
        print(arrayOne)
        print(subArray)//
		/**移除arr中wrongArr的数据*/
		 var arr = ["4","5","6"]
		 let wrongArr = ["4","5"]
		 arr = arr.filter { !wrongArr.contains($0) }
		 print(arr)

11、 函数

可变参数
inout可以修改属性的值,inout是放在参数类型前,冒号后,使用 inout之后,函数体内部可以直接更改参数值,而且改变会保留
比如:

	func test(old:inout [String]) -> Void {
        old = ["2","3"];
    }

		var old = ["2"];
        test(old: &old);
        print(old);//old值为["2","3"]

默认值参数、调用时省略参数名

	func testFunc() -> Void {
        print(self.testFuncOne(tag: 2));//2
        print(self.testFuncOne())//1
        
        print( self.testFuncTwo(3))//3
    }
    ///函数参数-配置默认值
    func testFuncOne(tag:Int = 1) -> Int {
        return tag;
    }
    ///函数参数---调用时可省略参数名
    func testFuncTwo(_ tag:Int) -> Int {
        return tag;
    }

12、循环

  //变量i在[0,5)循环,不包含5
        for i in 0..<5 {
            print(i)
        }
        //变量i在[0,5]循环,包含5
        for i in 0...5{
            print(i)
        }
        
        //反向循环
        for i in (0..<10).reversed(){
            print(i)
        }

13、 as? as!

as? 转换成功后,值将会是Optional(可选类型),失败则是nil。
调用接口传递参数时,如果使用as?转换成功后的值Optional(可选类型)会导致失败
as!转换成功后,直接就是强制转换的类型,失败则崩溃

     let nowDic:[String:Any] = ["name":"nht","value":"1"];
        /**转换完之后是下面的值
         ▿ Optional<String>
           - some : "1"
         */
        let name1 = nowDic["value"] as? String;
        /**转换成功就是字符串
         "1"
         */
        let name2 = nowDic["value"] as! String;

14 int转枚举值

//WirelessCommandType  需要转的枚举类型
 let commandType =  WirelessCommandType(rawValue: UInt(("2"))!);

15 类方法(+方法)

使用static关键字修饰

 @objc public static func GetConnectPSN()-> String {
 return "psn"
 }
 //OC中使用 Wirless_Special 类名
 [Wirless_Special GetConnectPSN];

16 实际为16进制Data类型数据如何正确打印

NSData.init(data: data)
转换之后在打印
print NSData.init(data: data)

OC 打印长数据
NSString *nnn = [Support_StringHexDataChange hexDataToHexStrig:replyData];
printf(“时间-%s–receiveData–%s\n”,[Support_Time getNowTimeTimeStampIsMillisecond:true].UTF8String, nnn.UTF8String);

添加一个宏定义
#define NSLog(format,…) printf(“%s”,[[NSString stringWithFormat:(format), ##VA_ARGS] UTF8String])

17 如何在view被添加到父视图上后进行一些操作

必须进行判断是否已经添加多,否则会重复

   ///是否已经加载到superview
    var didAddToSuperView = false;
    override func didMoveToSuperview() {
        if self.superview != nil && !self.didAddToSuperView{
            self.didAddToSuperView = true;
            self.setupView();
        }
    }

18 特殊字符

let str1 = "\"1234\""
print(str1);//最终结果是 "1234"

19 通知

 //发送通知
        NotificationCenter.default.post(name: Notification.Name("valueChange"), 
        object: nil);
        //注册通知
        NotificationCenter.default.addObserver(self, 
        selector: #selector(valueChange), 
        name: Notification.Name("valueChange"), object: nil)
         @objc func valueChange(){
        //响应方法
    }

20 SSL 错误

发生了SSL错误,无法建立与该服务器的安全连接
kCFStreamErrorCodeKey=-9802
info添加配置

	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSExceptionDomains</key>
		<dict>
			<key>**你的地址**</key>
			<dict>
				<key>NSIncludesSubdomains</key>
				<true/>
				<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
				<true/>
				<key>NSTemporaryExceptionMinimumTLSVersion</key>
				<string>TLSv1.1</string>
			</dict>
		</dict>
	</dict>

在这里插入图片描述

21 base64图片数据字符串转图片

如果返回的数据字符串中有前缀data:image/png;base64, 比如
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAAwCAIAAABSYzXUAAAOQklEQVR4Xu1aCVAUVxrGK5rEjbnVmGOjyW4uk2yIiYnG2rhuKp … RK5CYII=
需要先去掉前缀**data:image/png;base64,**然后再转换为data然后转换成图片,或者直接调用下面的方法转换

func stringToImage(str:String) -> UIImage {
        var photo = UIImage.init()
        let baseImageUrl = URL(string: str)!;
        
        do {
            let imageData = try Data(contentsOf: baseImageUrl)
            photo = UIImage(data: imageData as Data)!;
        } catch  {
            
        }
        return photo
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值