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
}