Swift 3: Вы также можете использовать семафоры на этом пути. Это очень полезно, кроме того, вы можете точно отслеживать, когда и какие процессы будут завершены. Это было извлечено из моего кода:
//You have to create your own queue or if you need the Default queue
let persons = persistentContainer.viewContext.persons
print("How many persons on database: \(persons.count())")
let numberOfPersons = persons.count()
for eachPerson in persons{
queuePersonDetail.async {
self.getPersonDetailAndSave(personId: eachPerson.personId){person2, error in
print("Person detail: \(person2?.fullName)")
//When we get the completionHandler we send the signal
semaphorePersonDetailAndSave.signal()
}
}
}
//Here we will wait
for i in 0..<numberOfPersons{
semaphorePersonDetailAndSave.wait()
NSLog("\(i + 1)/\(persons.count()) completed")
}
//And here the flow continues...
Во-первых, ваш метод должен быть инициализацией
, а не инициализацией
. Затем вы можете использовать super
для вызова метода родительского класса. Что касается вызова инициализатора C
в A
, для ясности я бы рекомендовал разделить материал инициализации на другую функцию, а затем просто вызвать эту функцию напрямую. Это проще реализовать, и это понятнее.
В Ruby нет конструкторов, поэтому, очевидно, их нельзя вызывать, родительские или иные. Однако в Ruby есть методы, и для вызова метода родителя с тем же именем, что и текущий выполняемый метод, вы можете использовать ключевое слово super
. [Примечание: super
без аргументов является ярлыком для передачи тех же аргументов, которые были переданы в текущий выполняемый метод. Если вы действительно хотите передать нет аргументов, вы должны сделать это явно: super()
.]
Используйте метод super
! Однако в Ruby нет множественного наследования.
class B
attr_accessor :b, :bb
def initialize(b, bb)
@b, @bb = b, bb
end
end
module C
end
class A < B
include C # <= if C was a class, you'd get: TypeError: wrong argument type Class (expected Module)
attr_accessor :a, :aa
def initialize(a,b,aa,bb)
@a, @aa = a, aa
super(b, bb) # <= calls B#initialize
end
end
a = A.new(1,2,3,4)
puts a.inspect # => #<A:0x42d6d8 @aa=3, @a=1, @b=2, @bb=4>