2016-12-16 4 views
2

Я новичок в быстром и много повторяющегося кода. Например, как бы вы изменили следующий код в различные функции:Глядя на понимание Swift Функции немного лучше

Пример 1

if let button = view.viewWithTag(12) as? UIButton { 
      // change any properties of the button as you would normally do 
      button.isHidden = true 
     } 

Пример 2

var oneAPlayer = AVAudioPlayer() 
var oneBPlayer = AVAudioPlayer() 
var oneCPlayer = AVAudioPlayer() 
var oneDPlayer = AVAudioPlayer() 
var twoAPlayer = AVAudioPlayer() 
var threeAPlayer = AVAudioPlayer() 
var fourAPlayer = AVAudioPlayer() 
let oneASound = Bundle.main.path(forResource: "1-a", ofType: "mp3") 
let oneBSound = Bundle.main.path(forResource: "1-b", ofType: "mp3") 
let oneCSound = Bundle.main.path(forResource: "1-c", ofType: "mp3") 
let oneDSound = Bundle.main.path(forResource: "1-d", ofType: "mp3") 
let twoASound = Bundle.main.path(forResource: "2-a", ofType: "mp3") 
let threeASound = Bundle.main.path(forResource: "3-a", ofType: "mp3") 
let fourASound = Bundle.main.path(forResource: "4-a", ofType: "mp3") 
+0

Я не могу дать хороший ответ о том, что делать с первой секцией (все экземпляры 'AVAudioPlayer'), но я написал ответ для обработки второго случая. Дайте мне знать, если вам нужно, чтобы я объяснил все его части. – Alexander

+0

Это ОЧЕНЬ хороший вопрос. IMNSHO – Confused

ответ

3

Я не обязательно использовать новую функцию для этого. Я бы написал это так:

let soundNames = ["1-a", "1-b", "1-c", "1-d", "2-a", "3-a", "4-a"] 
let sounds = soundNames.map{ Bundle.main.path(forResource: $0, ofType: "mp3") } 
+0

это хорошо, но, возможно, пример массива будет немного проще для новичков. – Fluidity

+0

@ Плотность Я отвечу на вопросы от OP по мере их появления, но я не заменяю руководство по языку. – Alexander

+2

Да, docsets отлично справляются с объяснением FP и декларативной парадигмы .. особенно для новичков;) Рекурсия и монады были бы отличным исходным материалом. – Fluidity

3

Ответ Alex хороший, но это довольно сложно для кого-то нового. Я бы посоветовал изучить основы функций перед попыткой функционального программирования (использование файлов .map, .filter и других интересных вещей).

Вот простой пример, который можно изменить во многих отношениях быть более гибкими при желании:

var sounds: [String:String] = [:] 

func addSound(_ num: Int,_ letter: Character) { 

    let key = String(num) + "-" + String(letter) 
    sounds[key] = Bundle.main.path(forResource: key, ofType: "mp3") 
} 

// Usage: 
addSound(1,"a") 

print(sounds["1-a"]) 

Что мы делаем, используя только одну переменную для хранения звуков в ... Доступ к вашим различные звуки, введя строку, как показано в разделе использования.

Это словарь, и они очень эффективны. Они работают на основе ключа и ценности.

Итак, у нас есть ключ от «1-a», и это будет набор, который мы добавили в функцию.

Функция в основном просто преобразует входные параметры, целое число и символ и превращает его в строку, которую мы можем использовать с нашим Bundle и Dictionary.



Если вы хотите добавить много звуков в одно время, вы можете преобразовать его в массив:

func addSounds(_ keys: [String]) { 

    for key in keys { 
    sounds[key] = Bundle.main.path(forResource: key, ofType: "mp3") 
    } 
} 

// Usage: 
addSounds(["1-a", "1-b"]) 
print(sounds["1-b"]) 

Это второй пример именно то, что Алекс сделал, его версия используется .map, который на самом деле является функцией, которая выполняет в основном то же самое, что и цикл for. Это отличная функция, но она фокусируется на так называемом декларативном программировании - что здорово - но в целом трудно учиться, когда только начинаешь.

+1

Я ценю усилия в этой должности, +1 – Alexander

+1

Это привлекательный код - он выглядит хорошо, он хорошо читается, а дядя Боб был бы горд. – crashlog

+0

@crashlog дядя боб бы НЕНАВИЖИМ мой код: P Я использовал комментарий !! – Fluidity