Skip to content

add Foundation NSString#52

Merged
teach310 merged 2 commits intofeature/central_manager_init_optionsfrom
feature/ns_string
Oct 25, 2023
Merged

add Foundation NSString#52
teach310 merged 2 commits intofeature/central_manager_init_optionsfrom
feature/ns_string

Conversation

@teach310
Copy link
Copy Markdown
Owner

@teach310 teach310 commented Oct 25, 2023

Description

DictionaryのKeyで使用するNSStringを追加
汎用的な文字列返却手段としても使える

NSStringクラスを追加した理由

汎用的な文字列取得実装のため。

MicrosoftのドキュメントでStringBuilderは非推奨と書かれていたためにStringBuilderを使い続けることに抵抗があった。
https://learn.microsoft.com/ja-jp/dotnet/standard/native-interop/best-practices

そして、NSDictionaryに文字列を登録するため

NSString.HandleToStringについて

流れに関してはXamarinの実装を参考にしている。
https://github.com/xamarin/xamarin-macios/blob/main/src/CoreFoundation/CFString.cs#L190-L224

ここではFromHandleという関数名だが、NSString.FromHandleという名前であればNSStringを返した方が自然だと思うためHandleToStringという名前にした。
引数のreleaseHandleに関してはSafeNSStringHandleをusingで破棄する方が書き心地よいと感じるため不要と判断した。

NSStringを使用している理由

swiftのStringは値型のためUnmanaged.passRetainedの引数にすることができない。
したがって、csharp側にポインタを渡すためにはCFStringまたはNSString等のクラスを用いる必要があった。

そして、CFStringよりもNSStringのほうが扱いやすかったためNSStringを使用している。
NSStringを参照型のクラスとして使用することはswiftの公式ドキュメントにも書かれている。

They provide reference semantics instead of value semantics, which is a useful tool to have in the toolbox.

https://github.com/apple/swift-corelibs-foundation

NSStringのcstringからのコピーをcsharp側で行っている理由

char配列を渡してそこにswiftで文字列を入れたところ文字化けしたから。
StringBuilderの場合は文字化けしないが前述の理由により避けた。
byte配列を渡せば文字化けしないかもしれないが、ArrayPoolが遅いかもしれず、最適な方法がわからなかったため
中身のコード見た感じ問題なさそうで一番楽なMarshal.PtrToStringUTF8を使用した。

https://source.dot.net/#System.Private.CoreLib/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.cs,80

LengthOfBytesUtf8について

使ってないけど、テストで活用できるため残している。

teach310 added 2 commits October 26, 2023 00:28
## NSStringクラスを追加した理由

汎用的な文字列取得実装のため。

MicrosoftのドキュメントでStringBuilderは非推奨と書かれていたためにStringBuilderを使い続けることに抵抗があった。
https://learn.microsoft.com/ja-jp/dotnet/standard/native-interop/best-practices

そして、NSDictionaryに文字列を登録するため

## NSString.HandleToStringについて

流れに関してはXamarinの実装を参考にしている。
https://github.com/xamarin/xamarin-macios/blob/main/src/CoreFoundation/CFString.cs#L190-L224

ここではFromHandleという関数名だが、NSString.FromHandleという名前であればNSStringを返した方が自然だと思うためHandleToStringという名前にした。
引数のreleaseHandleに関してはSafeNSStringHandleをusingで破棄する方が書き心地よいと感じるため不要と判断した。

## NSStringを使用している理由

swiftのStringは値型のためUnmanaged.passRetainedの引数にすることができない。
したがって、csharp側にポインタを渡すためにはCFStringまたはNSString等のクラスを用いる必要があった。

そして、CFStringよりもNSStringのほうが扱いやすかったためNSStringを使用している。
NSStringを参照型のクラスとして使用することはswiftの公式ドキュメントにも書かれている。

> They provide reference semantics instead of value semantics, which is a useful tool to have in the toolbox.

https://github.com/apple/swift-corelibs-foundation

## NSStringのcstringからのコピーをcsharp側で行っている理由

char配列を渡してそこにswiftで文字列を入れたところ文字化けしたから。
StringBuilderの場合は文字化けしないが前述の理由により避けた。
byte配列を渡せば文字化けしないかもしれないが、ArrayPoolが遅いかもしれず、最適な方法がわからなかったため
中身のコード見た感じ問題なさそうで一番楽なMarshal.PtrToStringUTF8を使用した。

https://source.dot.net/#System.Private.CoreLib/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.cs,80

## LengthOfBytesUtf8について
使ってないけど、テストで活用できるため残している。
良い。NSStringを解放したらこれも解放される(内部だから)。

> This C string is a pointer to a structure inside the string object, which may have a lifetime shorter than the string object and will certainly not have a longer lifetime.

https://developer.apple.com/documentation/foundation/nsstring/1411189-utf8string

## utf8StringはNSStringの中身だがこれをコピーしなくてよいのか?
NSStringはヒープなため別の場所にコピーするメリットはlifetimeをNSStringと分離することだと思う。
同じでいいためしなくて良いと判断

## cstringの文字列の長さの測り方

ここにstrlenを使った例がある
https://developer.apple.com/documentation/swift/string/utf8cstring
@teach310 teach310 added the add label Oct 25, 2023
@teach310 teach310 merged commit 89f5130 into feature/central_manager_init_options Oct 25, 2023
@teach310 teach310 deleted the feature/ns_string branch October 25, 2023 15:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant