Magento 2.4.3-p3 upgrading to 2.4.5 - Composer, Symfony error - magento2

I recently updated Magento from 2.4.3-p3 to 2.4.5.
Everything went well but i have few errors:
/usr/local/bin/php81 -d memory_limit=-1M /usr/local/bin/composer.phar update
Deprecated: Return type of Symfony\Component\Console\Helper\HelperSet::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/console/Helper/HelperSet.php on line 112
Deprecation Notice: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in phar:///usr/local/bin/composer.phar/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php:48
Deprecation Notice: Return type of Composer\Repository\ArrayRepository::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/Repository/ArrayRepository.php:277
Deprecation Notice: Return type of Composer\Repository\ArrayRepository::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/Repository/ArrayRepository.php:277
Deprecation Notice: Return type of Composer\Repository\ArrayRepository::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/Repository/ArrayRepository.php:277
Deprecation Notice: Return type of Composer\Repository\CompositeRepository::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/Repository/CompositeRepository.php:180
Deprecation Notice: Return type of Symfony\Component\Finder\Finder::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Finder.php:675
Deprecation Notice: Return type of Symfony\Component\Finder\Finder::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Finder.php:732
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\FilterIterator::rewind() should either be compatible with FilterIterator::rewind(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/FilterIterator.php:30
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\FileTypeFilterIterator::accept() should either be compatible with FilterIterator::accept(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php:42
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator::getChildren() should either be compatible with RecursiveDirectoryIterator::getChildren(): RecursiveDirectoryIterator, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php:85
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator::rewind() should either be compatible with FilesystemIterator::rewind(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php:113
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator::current() should either be compatible with FilesystemIterator::current(): SplFileInfo|FilesystemIterator|string, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php:65
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator::accept() should either be compatible with FilterIterator::accept(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php:55
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator::hasChildren() should either be compatible with RecursiveIterator::hasChildren(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php:71
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator::getChildren() should either be compatible with RecursiveIterator::getChildren(): ?RecursiveIterator, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php:76
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\FilterIterator::rewind() should either be compatible with Iterator::rewind(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/FilterIterator.php:30
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\FilenameFilterIterator::accept() should either be compatible with FilterIterator::accept(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/FilenameFilterIterator.php:28
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\PathFilterIterator::accept() should either be compatible with FilterIterator::accept(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/PathFilterIterator.php:27
Loading composer repositories with package information
Info from https://repo.packagist.org: #StandWithUkraine
In Laminas\DependencyPlugin\DependencyRewriterV2::onPrePoolCreate
Deprecation Notice: Return type of Composer\DependencyResolver\Pool::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/Pool.php:76
Updating dependencies
Deprecation Notice: Return type of Composer\DependencyResolver\RuleSet::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/RuleSet.php:116
Deprecation Notice: Return type of Composer\DependencyResolver\RuleSet::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/RuleSet.php:101
Deprecation Notice: Return type of Composer\DependencyResolver\Decisions::current() should either be compatible with Iterator::current(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/Decisions.php:155
Deprecation Notice: Return type of Composer\DependencyResolver\Decisions::next() should either be compatible with Iterator::next(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/Decisions.php:165
Deprecation Notice: Return type of Composer\DependencyResolver\Decisions::key() should either be compatible with Iterator::key(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/Decisions.php:160
Deprecation Notice: Return type of Composer\DependencyResolver\Decisions::valid() should either be compatible with Iterator::valid(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/Decisions.php:170
Deprecation Notice: Return type of Composer\DependencyResolver\Decisions::rewind() should either be compatible with Iterator::rewind(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/Decisions.php:150
Deprecation Notice: Return type of Composer\DependencyResolver\Decisions::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/Decisions.php:145
Deprecation Notice: Return type of Composer\DependencyResolver\RuleSetIterator::current() should either be compatible with Iterator::current(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/RuleSetIterator.php:36
Deprecation Notice: Return type of Composer\DependencyResolver\RuleSetIterator::next() should either be compatible with Iterator::next(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/RuleSetIterator.php:46
Deprecation Notice: Return type of Composer\DependencyResolver\RuleSetIterator::key() should either be compatible with Iterator::key(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/RuleSetIterator.php:41
Deprecation Notice: Return type of Composer\DependencyResolver\RuleSetIterator::valid() should either be compatible with Iterator::valid(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/RuleSetIterator.php:89
Deprecation Notice: Return type of Composer\DependencyResolver\RuleSetIterator::rewind() should either be compatible with Iterator::rewind(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/src/Composer/DependencyResolver/RuleSetIterator.php:70
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Package symfony/debug is abandoned, you should avoid using it. Use symfony/error-handler instead.
Package php-cs-fixer/diff is abandoned, you should avoid using it. No replacement was suggested.
Generating autoload files
122 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Deprecation Notice: Return type of Symfony\Component\Finder\Iterator\DepthRangeFilterIterator::accept() should either be compatible with FilterIterator::accept(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php:41
PHP CodeSniffer Config installed_paths set to ../../magento/magento-coding-standard,../../phpcompatibility/php-compatibility
Also i got few php_errorlog:
public_html/php_errorlog:
[25-Aug-2022 12:43:00 UTC] PHP Deprecated: Return type of Imagick::current() should either be compatible with Iterator::current(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in Unknown on line 0
[25-Aug-2022 12:43:00 UTC] PHP Deprecated: Return type of Imagick::next() should either be compatible with Iterator::next(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in Unknown on line 0
[25-Aug-2022 12:43:00 UTC] PHP Deprecated: Return type of Imagick::key() should either be compatible with Iterator::key(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in Unknown on line 0
[25-Aug-2022 12:43:00 UTC] PHP Deprecated: Return type of Imagick::valid() should either be compatible with Iterator::valid(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in Unknown on line 0
[25-Aug-2022 12:43:00 UTC] PHP Deprecated: Return type of Imagick::rewind() should either be compatible with Iterator::rewind(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in Unknown on line 0
[25-Aug-2022 12:43:00 UTC] PHP Deprecated: Return type of ImagickPixelIterator::current() should either be compatible with Iterator::current(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in Unknown on line 0
[25-Aug-2022 12:43:00 UTC] PHP Deprecated: Return type of ImagickPixelIterator::next() should either be compatible with Iterator::next(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in Unknown on line 0
[25-Aug-2022 12:43:00 UTC] PHP Deprecated: Return type of ImagickPixelIterator::key() should either be compatible with Iterator::key(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in Unknown on line 0
[25-Aug-2022 12:43:00 UTC] PHP Deprecated: Return type of ImagickPixelIterator::valid() should either be compatible with Iterator::valid(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in Unknown on line 0
[25-Aug-2022 12:43:00 UTC] PHP Deprecated: Return type of ImagickPixelIterator::rewind() should either be compatible with Iterator::rewind(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in Unknown on line 0
[25-Aug-2022 14:43:00 Europe/Zagreb] PHP Deprecated: Return type of Symfony\Component\Console\Helper\HelperSet::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/composer.phar/vendor/symfony/console/Helper/HelperSet.php on line 112
public_html/var/report/3f7cab26....:
{"0":"Deprecated Functionality: preg_match(): Passing null to parameter #2 ($subject) of type string is deprecated in \/public_html\/vendor\/amasty\/module-page-speed-tools\/Lib\/MobileDetect.php on line 1267","1":"#1 preg_match() called at [vendor\/amasty\/module-page-speed-tools\/Lib\/MobileDetect.php:1267]\n#2 Amasty\\PageSpeedTools\\Lib\\MobileDetect->match() called at [vendor\/amasty\/module-page-speed-tools\/Lib\/MobileDetect.php:1216]\n#3 Amasty\\PageSpeedTools\\Lib\\MobileDetect->isTablet() called at [vendor\/amasty\/module-page-speed-tools\/Model\/DeviceDetect.php:110]\n#4 Amasty\\PageSpeedTools\\Model\\DeviceDetect->detectDevice() called at [vendor\/amasty\/module-page-speed-tools\/Model\/DeviceDetect.php:86]\n#5 Amasty\\PageSpeedTools\\Model\\DeviceDetect->getDeviceParams() called at [vendor\/amasty\/module-page-speed-tools\/Model\/DeviceDetect.php:96]\n#6 Amasty\\PageSpeedTools\\Model\\DeviceDetect->getDeviceType() called at [vendor\/amasty\/module-lazy-load\/Plugin\/Framework\/App\/Http\/Context.php:43]\n#7 Amasty\\LazyLoad\\Plugin\\Framework\\App\\Http\\Context->beforeGetVaryString() called at [vendor\/magento\/framework\/Interception\/Interceptor.php:121]\n#8 Magento\\Framework\\App\\Http\\Context\\Interceptor->Magento\\Framework\\Interception\\{closure}() called at [vendor\/magento\/framework\/Interception\/Interceptor.php:153]\n#9 Magento\\Framework\\App\\Http\\Context\\Interceptor->___callPlugins() called at [generated\/code\/Magento\/Framework\/App\/Http\/Context\/Interceptor.php:59]\n#10 Magento\\Framework\\App\\Http\\Context\\Interceptor->getVaryString() called at [vendor\/magento\/framework\/App\/PageCache\/Identifier.php:57]\n#11 Magento\\Framework\\App\\PageCache\\Identifier->getValue() called at [vendor\/magento\/framework\/Interception\/Interceptor.php:58]\n#12 Magento\\Framework\\App\\PageCache\\Identifier\\Interceptor->___callParent() called at [vendor\/magento\/framework\/Interception\/Interceptor.php:138]\n#13 Magento\\Framework\\App\\PageCache\\Identifier\\Interceptor->Magento\\Framework\\Interception\\{closure}() called at [vendor\/magento\/framework\/Interception\/Interceptor.php:153]\n#14 Magento\\Framework\\App\\PageCache\\Identifier\\Interceptor->___callPlugins() called at [generated\/code\/Magento\/Framework\/App\/PageCache\/Identifier\/Interceptor.php:23]\n#15 Magento\\Framework\\App\\PageCache\\Identifier\\Interceptor->getValue() called at [vendor\/magento\/framework\/App\/PageCache\/Kernel.php:112]\n#16 Magento\\Framework\\App\\PageCache\\Kernel->load() called at [vendor\/magento\/module-page-cache\/Model\/App\/FrontController\/BuiltinPlugin.php:73]\n#17 Magento\\PageCache\\Model\\App\\FrontController\\BuiltinPlugin->aroundDispatch() called at [vendor\/magento\/framework\/Interception\/Interceptor.php:135]\n#18 Magento\\Framework\\App\\FrontController\\Interceptor->Magento\\Framework\\Interception\\{closure}() called at [vendor\/magento\/framework\/Interception\/Interceptor.php:153]\n#19 Magento\\Framework\\App\\FrontController\\Interceptor->___callPlugins() called at [generated\/code\/Magento\/Framework\/App\/FrontController\/Interceptor.php:23]\n#20 Magento\\Framework\\App\\FrontController\\Interceptor->dispatch() called at [vendor\/magento\/framework\/App\/Http.php:116]\n#21 Magento\\Framework\\App\\Http->launch() called at [vendor\/magento\/framework\/App\/Bootstrap.php:264]\n#22 Magento\\Framework\\App\\Bootstrap->run() called at [pub\/index.php:30]\n","url":"\/customer\/account\/create\/","script_name":"\/pub\/index.php","report_id":"3f7cab26179ab93d57289f24c3f88fe86a573d8121233c1cce8c037ca8483e13"}
If you need any more information, tell me and I'll attach it.
Thank you in advance for your help.
Best regards.

Related

Migrating textFieldConfiguration and maxLengthEnforced to new version of flutter

My old code is
maxLengthEnforced: widget.textFieldConfiguration.maxLengthEnforced,
and it gives error
Error: No named parameter with the name 'maxLengthEnforced'.
Some guids say I shoud replace maxLengthEnforced by maxLengthEnforcement.
But the new code:
maxLengthEnforcement: widget.textFieldConfiguration.maxLengthEnforcement,
gives new error:
The getter 'maxLengthEnforcement' isn't defined for the class 'TextFieldConfiguration<dynamic>'.
What should I do?
As per documentation,
Added a maxLengthEnforcement parameter using the new enum type
MaxLengthEnforcement, as a replacement for the now-deprecated boolean
maxLengthEnforced parameter
Now when it was a boolean, true/false was sufficient in your code, but now it is an enum so when you replaced maxLengthEnforced with maxLengthEnforcement, you also need to make changes in textFieldConfiguration to adjust to this change. Simple replacement will not work, hence the error.

Why my method fails with the "boolean expression must not be null" exception, but SharedPreferences.getBool() don't?

I'm new to Dart and I'm wondering why I can't return null instead of a bool value in a method like this:
bool getFoo(SharedPreferences sp) {
return sp.getBool('foo');
}
But the SharedPreferences.getBool() method can return null:
bool getBool(String key) => _preferenceCache[key];
Both methods have the same return value type-hint. But the Dart's standard lib method can return null. When I call getFoo(prefs) I'm getting the exception Failed assertion: boolean expression must not be null in my method, not in the Dart's std lib method. Why? What's the difference? Why two methods with the same type-hint definition behave differently?
There is no difference in how the two functions treat the return of null.
Currently, all Dart functions with a bool return type can return null because all Dart types are nullable.
That doesn't mean that you can use null as a boolean, just as you can't call string methods on a null value with static type String. The null value represents the absence of an actual value, so if you end up using null in a condition (if, while, ?:) then you will get the error that you are now seeing.
Dart does not have coercion between different types, and you cannot treat a non-boolean value as a boolean, not even null. Obviously the language could have chosen to do so, say treat all non-true values as false (like it did in Dart 1, before the stricter type system of Dart 2), but it's actually fairly arbitrary whether null should mean true or false, so instead null means the absence of a boolean value, and therefore not being able to choose a branch of an if statement. This is consistent with all other places where null can flow, but its an error if it does and you try to use the value.
When Dart gets non-nullable types, then the conditions will be required to be (statically typed as) non-nullable booleans. This ensures that a null value cannot accidentally flow to a position where it is attempted used.
If you know that your result might be null, you can always substitute a default value explicitly: if (maybeBool ?? false) ...
Again, with non-nullable types, you will have to do that, if you haven't handled the null value earlier.
The issue was in the if statement. It doesn't accept nulls and doesn't cast null to boolean false. It requires a boolean value. I came to Dart from PHP and JavaScript so this moment was very unobvious for me. And I didn't read documentation carefully: https://dart.dev/guides/language/language-tour#if-and-else.
I actually can't see any profits from this strictness like in strictly typed languages while I can return the null result for a scalar type. https://github.com/dart-lang/sdk/issues/22 - this is the very early issue that Dart lang developers still implementing, but promise to finish it soon.

Swift 4.2 - __shared attribute near type

https://developer.apple.com/documentation/swift/double?changes=latest_minor
In updated version of class definition I found init method for Double with NSNumber near type the unknown keyword __shared. What does it mean?
The __shared parameter annotation means that a value type parameter can be passed by reference.
For value types, this enables us to elide a copy before we make the call and instead pass a reference pointing right at the memory we allocated. SIL calls this convention in_guaranteed for (indirect reference with guaranteed lifetime). It's currently the way we pass self in non-mutating functions.
It was introduced by the Ownership Manifesto.
Here is the difference between the ownership annotations:
inout: mutating pointer-like value
__shared: non-mutating pointer-like value
__owned: an explicit way of writing the default
Here is a summary of the manifesto: Swift Ownership Manifesto TL;DR.

How to get the underlying Value from a Swift KeyPath when its type is KeyPath<Root, Value!>?

Take a look at the following code:
struct Something {
var s: String! // Implicitly Unwrapped Optional
}
func bind<T, V>(keyPath: WritableKeyPath<T, V?>) {
}
bind(\Something.s)
The code above does not compile. If we change the signature of bind to bind<T, V>(keyPath: WritableKeyPath<T, V>) then it does compile, but the problem is that the type of V is String! and I need to get the underlying type, in this case String.
We can solve the problem as follows:
func bind<T, V>(keypath: WritableKeyPath<T, ImplicitlyUnwrappedOptional<V>>) {
}
Unfortunately the documentation says that ImplicitlyUnwrappedOptional is deprecated. However, it is not marked as deprecated with the #available attribute.
I'm hesitant to use a type that the docs say are deprecated, but I can find no other way to accomplish what I need.
Is there another way to get the implicitly wrapped generic Value type from a WritableKeyPath when its type is WritableKeyPath<T, V!>?
Will ImplicitlyUnwrappedOptional be removed at some point?
Is there another way to get the implicitly wrapped generic Value type from a WritableKeyPath when its type is WritableKeyPath<T, V!>?
Not that I'm aware of. Really the problem here is that \Something.s shouldn't be a WritableKeyPath<T, V!>. That should be illegal under the rules set out by SE-0054 (IUOs are attributes on declarations; they're not actual types that can satisfy generic placeholders).
Instead, \Something.s should be a WritableKeyPath<T, V?>, so really your original code ought to compile. This issue has been filed as a bug here.
Will ImplicitlyUnwrappedOptional be removed at some point?
Yes, this is set out by SE-0054:
Because IUOs are an attribute on declarations rather than on types, the ImplicitlyUnwrappedOptional type, as well as the long form ImplicitlyUnwrappedOptional<T> syntax, is removed. Types with nested IUOs are no longer allowed. This includes types such as [Int!] and (Int!, Int!).
However the type-checker implementation for this wasn't fully implemented for Swift 4, which is why you're still able to use ImplicitlyUnwrappedOptional as a type in order to work around your problem. It has been implemented for Swift 5 though, so your workaround will no longer compile on its release.
Although hopefully the IUO key path bug will have been fixed by then.

<unknown>:0: error: type 'Key' constrained to non-protocol type 'String'

Migrating to Swift 3 from 2.3 and am running into this issue. The error is traceable to a view controller.
I do not see any extensions/protocols which would require a 'Key' constrained to 'String'.
I've tried to comment out code that might be causing the error, and have had strange results - ie removing an empty viewDidLoad() made the error appear in another class.
I'll update the thread if I make progress.
Key is a type inside a structure maybe a struct/class like Dictionary.
Use AnyHashable as Key to replace String if in Dictionary.