簡體   English   中英

了解Objective-C

[英]Understanding Objective-C

我試圖將代碼從我在Apple的在線示例代碼中找到的方法遷移到Swift,我對Objective-C 有所了解,但缺少一些關鍵漏洞。 我了解以下大多數代碼,非常感謝您提供以下幫助:

1)為什么第一個方法中有兩個return語句? 這兩個語句如何工作?

2)我不完全理解第二種方法的聲明:

  • “ buf”是一個參考,會迅速用“&”完成嗎?

  • “ at:(int *)iterator”是什么意思,它將如何迅速起作用?

  • 第二種方法的第一行中的[buf字節]是什么意思?

方法:

- (NSData *)getPublicKeyMod
{
    NSData* pk = [self getPublicKeyBits:@"RSA Public Key"];
    if (pk == NULL) return NULL;

    int iterator = 0;

    iterator++; // TYPE - bit stream - mod + exp
    [self derEncodingGetSizeFrom:pk at:&iterator]; // Total size

    iterator++; // TYPE - bit stream mod
    int mod_size = [self derEncodingGetSizeFrom:pk at:&iterator];

    return [pk subdataWithRange:NSMakeRange(iterator, mod_size)];
    return pk;
    NSLog(@"public size: %d",pk.length);
}

- (int)derEncodingGetSizeFrom:(NSData*)buf at:(int*)iterator
{
    const uint8_t* data = [buf bytes];
    int itr = *iterator;
    int num_bytes = 1;
    int ret = 0;

    if (data[itr] > 0x80) {
        num_bytes = data[itr] - 0x80;
        itr++;
    }

    for (int i = 0 ; i < num_bytes; i++) 
        ret = (ret * 0x100) + data[itr + i];

    *iterator = itr + num_bytes;
    return ret;
}

1)不適用於兩個語句。 第一個return語句之后的代碼將永遠不會執行。 此方法串行執行。

2)以下是您的項目符號問題的答案。

  • 在Swift中, buf不需要與&一起傳遞,除非您在方法簽名中為第一個參數使用了inout參數。 不需要這樣做,因為在方法中不會更改buf對象。

  • at:(int*)iterator是一個輸入參數,它定義一個指向Integer的指針。 因為它是一個指針,所以當通過此方法更改它時,它也會在調用者的作用域中更改。 可以使用方法簽名中的inout關鍵字將其移植到Swift,因為它已被更改,並且調用方法希望在方法完成執行時對其進行更改。 另外,您可以在Swift中更改方法簽名,以返回新的迭代器Integer以及它已經返回的值( ret ),因為Swift允許多個返回值。

  • [buf bytes]返回封裝在NSData實例中的數據; 原始字節。 如果您想進行一些調整,則可以使用bytes方法獲取數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM