Apple's Swift Compiler Complains of Partial Application When Creating Extension Method on Array

Apple's Swift compiler complains of partial application when creating extension method on Array

To use an operator as a function, surround it in parens:

var min = array.comparest({ $0 }, (<))!

For example:

[1,2,3].reduce(0,(+)) // -> 6

Can't create default closure parameter in Array extension method in Swift

The elements in an array don't have to be Comparable, which means you can't write that function for all possible Arrays.

Unfortunately Swift doesn't allow you to extend just a subset of Arrays. In other for your function to work, the compiler needs extra type information to infer the type C.

Others have struggled with this same issue:

How can we create a generic Array Extension that sums Number types in Swift?

Instead of using an extension, you should be able to use minimum as a global function.

What alternative when I get: Partial application of 'mutating' method is not allowed

One way is to accept an inout Test in technique. Also you should make apply mutating, because it undoubtedly changes the state of Test.

mutating func apply(technique: (inout Test, Int) -> ()) {
print("Before:\(value)")
technique(&self, 2) // this is "kind of" analogous to "self.technique(2)"
print("After:\(value)")
}

mutating func main() {
apply(technique: {
$0.increment(amount: $1)
})
}

Compiler complains that 'Expression resolved to unused function' when removing index in array of functions

Resolving to an unused function is trying to tell you that you have an expression that is returning a function type, but you never call it

So,you just need try to use it

typealias Type1 = Int
typealias Type2 = ([AnyObject?]) -> Void

class Test {
private var cb1: [Type1]
private var cb2: [Type2]

init() {
cb1 = [Type1](count: 2, repeatedValue: 0)
cb2 = [Type2](count: 2, repeatedValue: { _ in })
}

func removeAtIndex(index: Int) {
cb1.removeAtIndex(index)
let result = cb2.removeAtIndex(index)
}
}

Compiler complains that 'Expression resolved to unused function' when removing index in array of functions

Resolving to an unused function is trying to tell you that you have an expression that is returning a function type, but you never call it

So,you just need try to use it

typealias Type1 = Int
typealias Type2 = ([AnyObject?]) -> Void

class Test {
private var cb1: [Type1]
private var cb2: [Type2]

init() {
cb1 = [Type1](count: 2, repeatedValue: 0)
cb2 = [Type2](count: 2, repeatedValue: { _ in })
}

func removeAtIndex(index: Int) {
cb1.removeAtIndex(index)
let result = cb2.removeAtIndex(index)
}
}

Overriding methods in Swift extensions

Extensions cannot/should not override.

It is not possible to override functionality (like properties or methods) in extensions as documented in Apple's Swift Guide.

Extensions can add new functionality to a type, but they cannot override existing functionality.

Swift Developer Guide

The compiler is allowing you to override in the extension for compatibility with Objective-C. But it's actually violating the language directive.

That just reminded me of Isaac Asimov's "Three Laws of Robotics" /p>

Extensions (syntactic sugar) define independent methods that receive their own arguments. The function that is called for i.e. layoutSubviews depends on the context the compiler knows about when the code is compiled. UIView inherits from UIResponder which inherits from NSObject so the override in the extension is permitted but should not be.

So there's nothing wrong with grouping but you should override in the class not in the extension.

Directive Notes

You can only override a superclass method i.e. load() initialize()in an extension of a subclass if the method is Objective-C compatible.

Therefore we can take a look at why it is allowing you to compile using layoutSubviews.

All Swift apps execute inside the Objective-C runtime except for when using pure Swift-only frameworks which allow for a Swift-only runtime.

As we found out the Objective-C runtime generally calls two class main methods load() and initialize() automatically when initializing classes in your app’s processes.

Regarding the dynamic modifier

From the Apple Developer Library (archive.org)

You can use the dynamic modifier to require that access to members be dynamically dispatched through the Objective-C runtime.

When Swift APIs are imported by the Objective-C runtime, there are no guarantees of dynamic dispatch for properties, methods, subscripts, or initializers. The Swift compiler may still devirtualize or inline member access to optimize the performance of your code, bypassing the Objective-C runtime. /p>

So dynamic can be applied to your layoutSubviews -> UIView Class since it’s represented by Objective-C and access to that member is always used using the Objective-C runtime.

That's why the compiler allowing you to use override and dynamic.

Swift crash report function signature specialization Owned To Guaranteed

I suspect the registeredContacts comment (added by HockeyApp I believe) is not relevant here

No, I think you have it backwards. That is exactly what is relevant. It is your crash report that is not relevant.

SIGTRAP merely means that we got an exception. The exception is being thrown in the code (or rather, in the course of executing the code). But you don't seem to be getting any info as to what it is. My guess is that HockeyApp is actually interfering with your receiving the real report, which would tell you what the exception was.

The problem is thus somewhere in retrieveActivities. You might try to guess where by counting lines (you are told the number of lines into your method where the crash actually happens). It could be something as simple as out-of-bounds array access, I believe. The fact that an array registeredContacts is popping up here is thus quite suggestive. Look for a registeredContacts access at about that point in the method.

Command failed due to signal: Segmentation fault: 11

For anyone else coming across this... I found the issue was caused by importing a custom framework, I have no idea how to correct it. But simply removing the import and any code referencing items from the framework fixes the issue.

(╯°□°)╯︵ ┻━┻

Hope this can save someone a few hours chasing down which line is causing the issue.



Related Topics



Leave a reply



Submit