Swift中的感叹号( ! )与问号( ? )之谜


基本了解

在Swift代码会经常看到定义属性或方法参数时类型后面会紧跟一个感叹号( ! )或问号( ? ), 刚开始接触Swift的童鞋就可能不太明白之代表什么意思,一头雾水,开始凌乱了。
本文将带你了解感叹号( ! )与问号( ? )之谜,首先问号( ? )是可选类型,是用来处理值可能缺失的情况,也就是没有值的情况(也就是OC中NULL); 感叹号( ! )就是与之相反的, 就是一定有值(非可选类型),不存在空值的情况(OC中NULL)。
下面根据不同使用场景来进一步了解感叹号( ! )与问号( ? )之谜

各个场景中的叹号( ! )与问号( ? )

类的属性

class MyClass {
    
    var value: String!
    var optionalValue: String? // defaulit is nil, 所有定义为可选类型的,可选值都是nil, 和数据类型没有关系。
 }


Flutter开发: APK 打包错误 'xxxxxxxx/server.keystore' not found for signing config 'release'


翻译一下就是找不到签名配置中release配置一种可能是 build.gradle 没有定义release配置,
还有一种可能是 signingConfigs 放在 buildTypes 之后,导致找不到,我的是后者
修改方法就是把 signingConfigs 放在 buildTypes 之前就行了,

修改前代码
IMG


在macOS平台下制作SSL证书,免费域名通配符证、单域名证书、多域名证书教程


1、安装 home-brew

2、安装 certbot

在终端执行下面命令

brew install certbot

3、制作SSL证书

第一步: 在终端执行下面命令

sudo certbot certonly  -d *.example.com --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
1、提示输入密码时,输入电脑密码开机即可。
2、把 example.com 换成自己的域名即可。
3、如果你不想制作通用SSL证书,可以指定完整域名,比如www.example.comapi.example.comexample.com

第二步: 填写常用邮箱地址,按回车

IMG


Swift 5.2 新特性


  • Print 函数传参新格式
let param = "参数"
print(#"这是一个\#(param) xxxxx"#)
  • 允许在模块中定义和标准库中名称一样的类型

比如在MyModule模块中定义Result

public enum Result<T> {
    case value(T)
    case error(Error)
}

如果你在任何代码中引入了 MyModule,比如

import MyModule
func doSomething() -> Result<Int> {  }

这时如果你需要引用标准库中的Result类型,你需要这样做,否则Result将解析到MyModule中的Result

func useStandardLibraryResult() -> Swift.Result<Int, Error> {  /* */  }
  • @dynamiccalable属性

使用@dynamiccalable属性后,调用函数就像使用简单语句一样。

@dynamicCallable struct ToyCallable {
    func dynamicallyCall(withArguments: [Int]) {}
    func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, Int>) {  }
}

var x = ToyCallable()
x(1, 2, 3)
 // Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])`
        
x(label: 1, 2)
// Desugars to `x.dynamicallyCall(withKeywordArguments: ["label": 1, "": 2])`


MySQL: 定义方法


MySQL中方法和开发语言中的方法不太一样,MySQL中方法必须要有返回值。
MySQL中方法与储存过程很相似,相比有以下不同点:

  • 调用不同,储存过程是用CALL调用,方法是用SELECT调用
  • 方法的参数前不能使用IN,OUT,而储存过程是可以使用的
  • 方法中在BEGINEND之间(方法体)如果用SELECT来查询,必须要有一个变量来接收结果,否则是不允许的,而储存过程没这个限定

示例代码

CREATE FUNCTION `jion_test`(age INT, uname VARCHAR(45), tool VARCHAR(45)) RETURNS varchar(100)
BEGIN
/*
一些代码
*/
RETURN CONCAT(age*2, tool, uname);
END
RETURNS 后面是返回类型, 参数可以没有

调用示例

SELECT jion_test(10, 'MY_NAME', 'MY_TOOL');
# SET @_result = (jion_test(10, 'MY_NAME', 'MY_TOOL'));

Swift 5.2 处理转义字符新方式


在之前如果字符串包含 \"\\等转义字符,一般是这样做

let string1 = "\\string1\"string2\\\\"
print(string1) /// \string1"string2\\

而现在只要字符串前后各加一个 #, 如果里面的包含转义字符就不会被当做转义字符处理

let string2 = #"\string1"string2\\"#
print(string2) /// \string1"string2\\

MySQL:随机字符串及大小写转换


随机字符串

SET @randomString = MD5(RAND());

截取字符串

SET @newString = SUBSTRING(@randomString, 1, 32);
从第一个位置开始截取,截取到第32个长度

转成大写

SET @upperString = UPPER(@newString);

转成小写

SET @lcaseString = LCASE(@upperString);

MySQL:查询使用正则表达式匹配


不区分大小写

1、columnName的值必须由字母组成

SELECT * FROM tableName WHERE columnName REGEXP '^[A-Z]$';
# SELECT * FROM tableName WHERE columnName REGEXP '^[a-z]$';

2、columnName的值必须包含字母

SELECT * FROM tableName WHERE columnName REGEXP '[A-Z]';
# SELECT * FROM tableName WHERE columnName REGEXP '[a-z]';
由于不区分大小写,使用注释中的代码得到和结果也是一样的

区分大小写,使用 BINARY 关键词

1、columnName的值必须以大写字母开头,紧接着全是数字

SELECT * FROM tableName WHERE columnName REGEXP BINARY '^[A-Z]+[0-9]*$';

2、columnName的值必须以小写字母开头

SELECT * FROM tableName WHERE columnName REGEXP BINARY '^[a-z]+[0-9]*$';

New Year 2019


又是新的一年,也没什么可表示的,用程序员的方法给大家贺个年

  • Objective-C
NSLog(@"Hello, 猪年快乐, 在新的一年里代码永无Bug");
  • Swift
print("Hello, 猪年快乐, 在新的一年里代码永无Bug")
  • PHP
echo 'Hello, 猪年快乐, 在新的一年里代码永无Bug';
  • Shell
echo "Hello, 猪年快乐, 在新的一年里代码永无Bug";
  • Ruby
puts "Hello, 猪年快乐, 在新的一年里代码永无Bug"
  • MySQL
SELECT "Hello, 猪年快乐, 在新的一年里代码永无Bug";


Swift:字符串(String)分割之Substring优雅转换


认识Substring类型

这是一个全新的类型,看类名像是String的子类,但是大家千万别被误导了,Substring并不是String的子类,这是两个不同的类型,但是它们都继承了StringProtocol协议,因此存在一些共性;在开发中Substring并不常用(目前只在分割String见到),所以往往要转成String

字符串(String)分割函数

下面是Swift中分割函数定义

public func split(separator: Character, maxSplits: Int = default, omittingEmptySubsequences: Bool = default) -> [Substring]

从定义我们知道返回类型是[Substring],并不是[String]

参数描述
separator分割标识
maxSplits最大分割次数,1=表示只分割2次就停止,2=表示只分割2次就停止,以此类推,默认值为Int.max
omittingEmptySubsequences是否忽略空值,true=忽略空值, fasle=不忽略空值, 默认值为true