是否可以创建一个在运行时可以具有任意数量的动态属性的Objective-C类?
我希望能够mySpecialClass.anyProperty
在我的类中调用和拦截它,以便能够提供我自己的自定义实现,然后可以NSString
在运行时返回(例如)引发异常.显然这一切都要编译.
理想的情况是,如果我可以使用类似于新文字语法的东西来引用我的属性,例如mySpecialClass["anyProperty"]
.
我想在某种程度上我想创建类似动态NSDictionary的东西,没有CFDictionary后备存储,它分别在属性获取和设置上执行2个自定义方法,属性名称传递给这些访问器方法,以便他们可以决定做什么.
我正在将一个有效的Objective-C类别(NSData + AESCrypt.m)移植到Swift,我发现了一个与指针一起工作的问题.Swift中加密部分的代码正确编译,但生成运行时EXEC_BAD_ACCES错误.
我到目前为止的代码是(我试图尽可能地剖析代码):
let key = "123456789012345678901234567890120"
let keyLength = UInt(kCCKeySizeAES256 + 1)
let keyPointer = strdup(key) // Convert key to <UnsafeMutablePointer<Int8>
let message = "Don´t try to read this text. Top Secret Stuff"
let data = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding)
let dataBytes = data?.bytes
let length = data?.length
let dataLength = UInt(length!)
let dataPointer = UnsafePointer<UInt8>(dataBytes!)
let operation: CCOperation = UInt32(kCCEncrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
let cryptBufferSize = UInt(dataLength + kCCBlockSizeAES128) …
Run Code Online (Sandbox Code Playgroud) 我在AES256工作,能够使用不安全的渠道在iOS和PHP之间加密/解密.
我已经看到很多类似的问题围绕密钥大小,模式(CBC或ECB),随机iv的使用等等.但在这种情况下,我发现了一个奇怪的行为,如下所示.
在两种环境中配置: - 密钥:32字节(256位) - 块大小:128位(标准) - iv:16字节(静态用于测试目的) - 模式:CBC
如果我加密16或32字节的文本(以匹配AES块大小),Swift和PHP中的结果相似但不完全相同:
key ="12345678901234567890123456789012"plainText ="12345678901234567890123456789012"iv ="1234567890123456"
Swift cipher = e5RnnlJkv4QGnGhkMwfvgMHr80NWUVhbvvfCdPQ5V2KyKJTx4KfWmn4HXi4dG0b8 PHP cipher = e5RnnlJkv4QGnGhkMwfvgMHr80NWUVhbvvfCdPQ5V2I =
如您所见,PHP Base64字符串的密码长度和最后2个字符存在差异.
但是,如果我使用的文本不是AES128块大小乘数,请说"Hello World",bot环境会报告不同(但大小相同)的密码,如下所示
Swift cipher = bdwO/5C8a + pliIoIXtuzfA ==
PHP密码= oPotHCkxpOwQhIaCz6hNMw ==
在这两种情况下(Swift和PHP),无论明文的大小如何,都能正确解密密码.此外,Swift结果与代码的Objective-C版本一致
附上使用的简化代码:
PHP
$key = "12345678901234567890123456789012";
$iv = "1234567890123456";
$plaintext = "Hello World";
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_CBC, $iv);
$ciphertext_base64 = base64_encode($ciphertext);
echo "ciphertext: ".$ciphertext_base64."</br>";
Run Code Online (Sandbox Code Playgroud)
迅速
let keyData: NSData! = (key as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!
let keyBytes = UnsafePointer<UInt8>(keyData.bytes)
let …
Run Code Online (Sandbox Code Playgroud) 所有我的Passbook环境都可以正常工作(基于PHP/MySQL的服务器用于传递生成和签名,以及传递下载 - 基于webview的下载,通过电子邮件传递或使用PassKit在我的应用程序内部显示).
唯一不起作用的是优惠券类型传递的主要字段中labelColor的颜色.
我有(在pass.json文件中):
"foregroundColor" : "rgb(30, 30, 30)",
"backgroundColor" : "rgb(230, 230, 230)",
"labelColor" : "rgb(30, 30, 30)",
Run Code Online (Sandbox Code Playgroud)
foregroundColor和backgroundColor工作正常,但labelColor(显示在条形图像的顶部)是白色的,而不是指定的labelColor.
根据Apple的Passbook包参考,labelColor是可选的
"可选.标签文本的颜色,指定为CSS样式的RGB三元组.例如,rgb(255,255,255).如果省略,标签颜色将自动确定."
在这种情况下,条形图像是一个清晰的图像,因此,文本应该是黑色的(即使省略了labelColor并且颜色自动确定),但尝试在通行证中显示为白色
任何帮助,将不胜感激.
...... e
我正在将基于CoreText的应用程序转换为Swift,并且在将匹配项添加到文本中的正则表达式时遇到问题.
这是示例代码
let regexOptions = NSRegularExpressionOptions.CaseInsensitive | NSRegularExpressionOptions.DotMatchesLineSeparators
let regex = NSRegularExpression.regularExpressionWithPattern("(.*?)(<[^>]+>|\\Z)", options: regexOptions, error: nil)
var results: Array<NSTextCheckingResult> = regex.matchesInString(text, options: 0, range: NSMakeRange(0, countElements(text)))
Run Code Online (Sandbox Code Playgroud)
根据文档,该matchesInString
函数返回一个数组NSTextCheckingResults
,但编译器抱怨声明"类型anyObject []的表达式无法转换为" NSMatchingOptions
".任何想法可能在这里出错?
我试图在运行时使用char*字符串在Objective-C中创建一个块.但我找不到办法.
我认为Objective-C的动态性质可以做类似的事情
char *blockString = "^(int a, int b) {return a + b;};";
printf("%s\n", blockString);
int (^addBlock)(int a, int b) = (^)*blockString;
int result = addBlock(3, 6);
Run Code Online (Sandbox Code Playgroud)
显然,第三行的语法对于编译器来说太过古怪,但我希望它能让你了解我想要实现的目标.
这可能吗?
我们正在使用Swift在iOS中实现SQLite,而不使用包装器或Objective-C桥接.一切正常,除了在进行查询和提取结果时.问题是UnsafePointer<UInt8>
从Swite中的SQLite返回的,如下所示:
var querySQL = "SELECT address, phone FROM CONTACTS WHERE NAME = 'myName'"
var cQuery = querySQL.cStringUsingEncoding(NSUTF8StringEncoding)
var statement: COpaquePointer = nil
if sqlite3_prepare_v2(contactsDB, cQuery!, -1, &statement, nil) == SQLITE_OK {
if sqlite3_step(statement) == SQLITE_ROW {
var address : UnsafePointer<UInt8> = sqlite3_column_text(statement, 0)
var data = NSData(bytes: address, length: 10)
var string = NSString(data: data, encoding: NSUTF8StringEncoding)
println(string)
Run Code Online (Sandbox Code Playgroud)
如您所见,如果我们知道对象的长度(在本例中为10),我们可以将指针转换为String
为了深入研究这个问题,我有以下例子
let pointerFromString: UnsafePointer<Int8> = "xyz".cStringUsingEncoding(NSUTF8StringEncoding)
let stringFromPointer = String.fromCString(anotherPointerFromString_Int8) println(stringFromPointer!)
Run Code Online (Sandbox Code Playgroud)
鉴于这CChar
是别名Int8
,我可以将a转换String
为UnsafePointer<Int8> …
运行 Xcode 11.3
为什么 pi 的有效成分等于 pi/2?
print(CGFloat.pi.significand == CGFloat.pi/2). // true
Run Code Online (Sandbox Code Playgroud)
我期望有效值等于尾数。我错过了什么吗?
我正在一个涉及RSA加密的swift项目中工作,我遇到了如下指针问题:
我有一个全局var publicKey: SecKey?
可选值,我需要获取UnsafeMutablePointer<Unmanaged<SecKey>?>
指向它的指针,这是SecKeyGeneratePair
函数中所需的数据类型 .
我试图将指针定义为:
var keyPointer = UnsafeMutablePointer<Unmanaged<SecKey>?>(publicKey!)
Run Code Online (Sandbox Code Playgroud)
但是编译器抱怨a 不能使用@lvalue SecKey类型的参数调用'init'错误
根据使用Swift with Cocoa和Objective-C的书,在Core Foundation和Unmanaged Objects部分中,它声明该Unmanaged<T>
结构提供了2种方法takeUnretainedValue()
和takeRetainedValue()
.但试图实现它们,会出现以下错误
var keyPointer = UnsafeMutablePointer<Unmanaged<SecKey>?>(publicKey!.takeRetainedValue())
Run Code Online (Sandbox Code Playgroud)
'SecKey'没有名为'takeRetainedValue'的成员
任何帮助解决这个问题将不胜感激
swift ×6
ios ×5
objective-c ×3
encryption ×2
aes ×1
cgfloat ×1
commoncrypto ×1
core-text ×1
cryptography ×1
mantissa ×1
passbook ×1
php ×1
pointers ×1
regex ×1
rsa ×1
sqlite ×1
unmanaged ×1