2016-10-06 2 views
1

При попытке удалить суффикс из filename я остался только с суффиксом, который точно не то, что я хочу.Удалить суффикс из имени файла в Swift

Что (как много) я делаю неправильно здесь:

let myTextureAtlas = SKTextureAtlas(named: "demoArt") 

let filename = (myTextureAtlas.textureNames.first?.characters.split{$0 == "."}.map(String.init)[1].replacingOccurrences(of: "\'", with: ""))! as String 

print(filename) 

Печатается png, который является наиболее тусклой частью всего этого.

+0

Используйте первый объект 'карта (String.init) [0] 'передать индекс 0 вместо 1 или использовать' first? 'Непосредственно' map (String.init) .first? ' –

+0

Что это делается по-другому? – Confused

+0

Можете ли вы объяснить: «Что это делает по-другому?« –

ответ

1

Вы также можете разделить строку, используя componentsSeperatedBy, как это:

let fileName = "demoArt.png" 
var components = fileName.components(separatedBy: ".") 
if components.count > 1 { // If there is a file extension 
    components.removeLast() 
    return components.joined(separator: ".") 
} else { 
    return fileName 
} 

уточнить:

fileName.components(separatedBy: ".") 

возвращает массив, состоящий из " demoArt "и" png ".

+1

Я только что получил это, работая в цикле. ОЧЕНЬ КРУТО! Эта функция и ее синтаксис (на моих глазах) намного легче понять, посмотреть и включить. Очень, ОЧЕНЬ круто! – Confused

+0

@Confused, рад, что это сработало для вас! Да, я думаю, что это самый простой способ сделать это. – WMios

+0

Мне это очень нравится. Простой, лаконичный, –

3

В массиве iOS начинаются с 0, и вы хотите, чтобы имя файла не было добавочным, поэтому вы разделили строку с помощью ., теперь имя будет сохранено в первом объекте и расширение во втором.

Простой пример

let fileName = "demoArt.png" 
let name = fileName.characters.split(".").map(String.init).first 
+0

argh, так что это является очень мощным маленьким фрагментом кода, разделяя и сохраняя имя, первую часть в позиции [0], вторую часть в позиции [1]. Каково имя этого массива? map? – Confused

+1

'split (". ")' возвращает character Просмотреть и использовать функцию карты, мы создали String из нее, если вы не используете '.first', тогда имя будет массивом с двумя объектами. –

+0

@Confused Вы получаете теперь, как работает' split'? –

2

Вы также можете использовать Regexp извлечь всю часть до последней точки, как, что:

let fileName = "test.png" 
let pattern = "^(.*)(\\.[a-zA-Z]+)$" 
let regexp = try! NSRegularExpression(pattern: pattern, options: []) 
let extractedName = regexp.stringByReplacingMatches(in: fileName, options: [], range: NSMakeRange(0, fileName.characters.count), withTemplate: "$1") 
print(extractedName) //test 
+0

Strewth. Путь за пределами моей stringFu, но очень классный, чтобы знать. Я уверен, что мне это понадобится совсем скоро ... СПАСИБО! – Confused

3

Некоторые люди здесь, кажется, упускать из виду, что имя файла может иметь несколько периодов во имя и в том, что case только последний период отделяет расширение файла. Поэтому this.is.a.valid.image.filename.jpg и снятие расширения должно возвращать this.is.a.valid.image.filename, а не this (как здесь будут два ответа) или что-то еще между ними. Ответ регулярного выражения работает правильно, но с использованием регулярного выражения для этого является немного избыточным (вероятно, в 10 раз медленнее, чем при использовании простой обработки строк). Вот общая функция, которая работает для всех:

func stripFileExtension (_ filename: String) -> String { 
    var components = filename.components(separatedBy: ".") 
    guard components.count > 1 else { return filename } 
    components.removeLast() 
    return components.joined(separator: ".") 
} 

print("1: \(stripFileExtension("foo"))") 
print("2: \(stripFileExtension("foo.bar"))") 
print("3: \(stripFileExtension("foo.bar.foobar"))") 

Выход:

foo 
foo 
foo.bar 
1

пусть mp3files = [ "alarm.mp3", "bubbles.mp3", "fanfare.mp3"]

пусть ringtonsArray = mp3Files.flatMap {$ 0.components (separatedBy: "") первым.}

1

@Confused с Swift 4 вы можете сделать это:

let fileName = "demoArt.png" 
// or on your specific case: 
// let fileName = myTextureAtlas.textureNames.first 

let name = String(fileName.split(separator: ".").first!) 
print(name) 

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

Btw, так как я тоже нужно это в последнее время, если вы хотите удалить определенный суффикс вы знаете заранее, вы можете сделать что-то вроде этого:

let fileName = "demoArt.png" 
let fileNameExtension = ".png" 

if fileName.hasSuffix(fileNameExtension) { 
    let name = fileName.prefix(fileName.count - fileNameExtension.count) 
    print(name) 
} 
+1

@ Мориц, да. Я добавил его, потому что я получил предупреждение здесь, вероятно, потому, что начал с другого кода. Это исправлено сейчас, спасибо. –

Смежные вопросы